github.com/xtls/xray-core@v1.8.12-0.20240518155711-3168d27b0bdb/infra/conf/serial/builder.go (about)

     1  package serial
     2  
     3  import (
     4  	"io"
     5  
     6  	creflect "github.com/xtls/xray-core/common/reflect"
     7  	"github.com/xtls/xray-core/core"
     8  	"github.com/xtls/xray-core/infra/conf"
     9  	"github.com/xtls/xray-core/main/confloader"
    10  )
    11  
    12  func MergeConfigFromFiles(files []string, formats []string) (string, error) {
    13  	c, err := mergeConfigs(files, formats)
    14  	if err != nil {
    15  		return "", err
    16  	}
    17  
    18  	if j, ok := creflect.MarshalToJson(c); ok {
    19  		return j, nil
    20  	}
    21  	return "", newError("marshal to json failed.").AtError()
    22  }
    23  
    24  func mergeConfigs(files []string, formats []string) (*conf.Config, error) {
    25  	cf := &conf.Config{}
    26  	for i, file := range files {
    27  		newError("Reading config: ", file).AtInfo().WriteToLog()
    28  		r, err := confloader.LoadConfig(file)
    29  		if err != nil {
    30  			return nil, newError("failed to read config: ", file).Base(err)
    31  		}
    32  		c, err := ReaderDecoderByFormat[formats[i]](r)
    33  		if err != nil {
    34  			return nil, newError("failed to decode config: ", file).Base(err)
    35  		}
    36  		if i == 0 {
    37  			*cf = *c
    38  			continue
    39  		}
    40  		cf.Override(c, file)
    41  	}
    42  	return cf, nil
    43  }
    44  
    45  func BuildConfig(files []string, formats []string) (*core.Config, error) {
    46  	config, err := mergeConfigs(files, formats)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	return config.Build()
    51  }
    52  
    53  type readerDecoder func(io.Reader) (*conf.Config, error)
    54  
    55  var ReaderDecoderByFormat = make(map[string]readerDecoder)
    56  
    57  func init() {
    58  	ReaderDecoderByFormat["json"] = DecodeJSONConfig
    59  	ReaderDecoderByFormat["yaml"] = DecodeYAMLConfig
    60  	ReaderDecoderByFormat["toml"] = DecodeTOMLConfig
    61  
    62  	core.ConfigBuilderForFiles = BuildConfig
    63  	core.ConfigMergedFormFiles = MergeConfigFromFiles
    64  }