builder.go 1.6 KB

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