mergers.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package mergers
  2. //go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen
  3. import (
  4. "strings"
  5. core "github.com/v2fly/v2ray-core/v4"
  6. "github.com/v2fly/v2ray-core/v4/common"
  7. "github.com/v2fly/v2ray-core/v4/infra/conf/json"
  8. )
  9. func init() {
  10. common.Must(RegisterMerger(makeMerger(
  11. core.FormatJSON,
  12. []string{".json", ".jsonc"},
  13. nil,
  14. )))
  15. common.Must(RegisterMerger(makeMerger(
  16. core.FormatTOML,
  17. []string{".toml"},
  18. json.FromTOML,
  19. )))
  20. common.Must(RegisterMerger(makeMerger(
  21. core.FormatYAML,
  22. []string{".yml", ".yaml"},
  23. json.FromYAML,
  24. )))
  25. common.Must(RegisterMerger(
  26. &Merger{
  27. Name: core.FormatAuto,
  28. Extensions: nil,
  29. Merge: Merge,
  30. }),
  31. )
  32. }
  33. // Merger is a configurable format merger for V2Ray config files.
  34. type Merger struct {
  35. Name string
  36. Extensions []string
  37. Merge MergeFunc
  38. }
  39. // MergeFunc is a utility to merge V2Ray config from external source into a map and returns it.
  40. type MergeFunc func(input interface{}, m map[string]interface{}) error
  41. var (
  42. mergersByName = make(map[string]*Merger)
  43. mergersByExt = make(map[string]*Merger)
  44. )
  45. // RegisterMerger add a new Merger.
  46. func RegisterMerger(format *Merger) error {
  47. if _, found := mergersByName[format.Name]; found {
  48. return newError(format.Name, " already registered.")
  49. }
  50. mergersByName[format.Name] = format
  51. for _, ext := range format.Extensions {
  52. lext := strings.ToLower(ext)
  53. if f, found := mergersByExt[lext]; found {
  54. return newError(ext, " already registered to ", f.Name)
  55. }
  56. mergersByExt[lext] = format
  57. }
  58. return nil
  59. }