builder.go 1.6 KB

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