package core

import (
	"io"
	"io/ioutil"

	"v2ray.com/core/common"

	"github.com/golang/protobuf/proto"
)

type ConfigLoader func(input io.Reader) (*Config, error)

var configLoaderCache = make(map[ConfigFormat]ConfigLoader)

func RegisterConfigLoader(format ConfigFormat, loader ConfigLoader) error {
	configLoaderCache[format] = loader
	return nil
}

func LoadConfig(format ConfigFormat, input io.Reader) (*Config, error) {
	loader, found := configLoaderCache[format]
	if !found {
		return nil, common.ErrBadConfiguration
	}
	return loader(input)
}

func LoadProtobufConfig(input io.Reader) (*Config, error) {
	config := new(Config)
	data, _ := ioutil.ReadAll(input)
	if err := proto.Unmarshal(data, config); err != nil {
		return nil, err
	}
	return config, nil
}

func init() {
	RegisterConfigLoader(ConfigFormat_Protobuf, LoadProtobufConfig)
}