| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package serial
- import (
- "context"
- "io"
- "github.com/xtls/xray-core/common/errors"
- creflect "github.com/xtls/xray-core/common/reflect"
- "github.com/xtls/xray-core/core"
- "github.com/xtls/xray-core/infra/conf"
- "github.com/xtls/xray-core/main/confloader"
- )
- func MergeConfigFromFiles(files []string, formats []string) (string, error) {
- c, err := mergeConfigs(files, formats)
- if err != nil {
- return "", err
- }
- if j, ok := creflect.MarshalToJson(c, true); ok {
- return j, nil
- }
- return "", errors.New("marshal to json failed.").AtError()
- }
- func mergeConfigs(files []string, formats []string) (*conf.Config, error) {
- cf := &conf.Config{}
- for i, file := range files {
- errors.LogInfo(context.Background(), "Reading config: ", file)
- r, err := confloader.LoadConfig(file)
- if err != nil {
- return nil, errors.New("failed to read config: ", file).Base(err)
- }
- c, err := ReaderDecoderByFormat[formats[i]](r)
- if err != nil {
- return nil, errors.New("failed to decode config: ", file).Base(err)
- }
- if i == 0 {
- *cf = *c
- continue
- }
- cf.Override(c, file)
- }
- return cf, nil
- }
- func BuildConfig(files []string, formats []string) (*core.Config, error) {
- config, err := mergeConfigs(files, formats)
- if err != nil {
- return nil, err
- }
- return config.Build()
- }
- type readerDecoder func(io.Reader) (*conf.Config, error)
- var ReaderDecoderByFormat = make(map[string]readerDecoder)
- func init() {
- ReaderDecoderByFormat["json"] = DecodeJSONConfig
- ReaderDecoderByFormat["yaml"] = DecodeYAMLConfig
- ReaderDecoderByFormat["toml"] = DecodeTOMLConfig
- core.ConfigBuilderForFiles = BuildConfig
- core.ConfigMergedFormFiles = MergeConfigFromFiles
- }
|