mirror of https://github.com/v2ray/v2ray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.1 KiB
46 lines
1.1 KiB
package core |
|
|
|
import ( |
|
"io" |
|
|
|
"v2ray.com/core/common" |
|
"v2ray.com/core/common/buf" |
|
|
|
"github.com/golang/protobuf/proto" |
|
) |
|
|
|
// ConfigLoader is an utility to load V2Ray config from external source. |
|
type ConfigLoader func(input io.Reader) (*Config, error) |
|
|
|
var configLoaderCache = make(map[ConfigFormat]ConfigLoader) |
|
|
|
// RegisterConfigLoader add a new ConfigLoader. |
|
func RegisterConfigLoader(format ConfigFormat, loader ConfigLoader) error { |
|
configLoaderCache[format] = loader |
|
return nil |
|
} |
|
|
|
// LoadConfig loads config with given format from given source. |
|
func LoadConfig(format ConfigFormat, input io.Reader) (*Config, error) { |
|
loader, found := configLoaderCache[format] |
|
if !found { |
|
return nil, newError(ConfigFormat_name[int32(format)], " is not loadable.") |
|
} |
|
return loader(input) |
|
} |
|
|
|
func loadProtobufConfig(input io.Reader) (*Config, error) { |
|
config := new(Config) |
|
data, err := buf.ReadAllToBytes(input) |
|
if err != nil { |
|
return nil, err |
|
} |
|
if err := proto.Unmarshal(data, config); err != nil { |
|
return nil, err |
|
} |
|
return config, nil |
|
} |
|
|
|
func init() { |
|
common.Must(RegisterConfigLoader(ConfigFormat_Protobuf, loadProtobufConfig)) |
|
}
|
|
|