merger_base.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package mergers
  2. import (
  3. "fmt"
  4. "io"
  5. "github.com/v2fly/v2ray-core/v5/common/cmdarg"
  6. "github.com/v2fly/v2ray-core/v5/common/errors"
  7. "github.com/v2fly/v2ray-core/v5/infra/conf/merge"
  8. )
  9. type jsonConverter func(v []byte) ([]byte, error)
  10. // makeMerger makes a merger who merge the format by converting it to JSON
  11. func makeMerger(name string, extensions []string, converter jsonConverter) *Merger {
  12. return &Merger{
  13. Name: name,
  14. Extensions: extensions,
  15. Merge: makeToJSONMergeFunc(converter),
  16. }
  17. }
  18. // makeToJSONMergeFunc makes a merge func who merge the format by converting it to JSON
  19. func makeToJSONMergeFunc(converter func(v []byte) ([]byte, error)) MergeFunc {
  20. return func(input interface{}, target map[string]interface{}) error {
  21. if input == nil {
  22. return nil
  23. }
  24. if target == nil {
  25. return errors.New("merge target is nil")
  26. }
  27. switch v := input.(type) {
  28. case string:
  29. err := loadFile(v, target, converter)
  30. if err != nil {
  31. return err
  32. }
  33. case []string:
  34. err := loadFiles(v, target, converter)
  35. if err != nil {
  36. return err
  37. }
  38. case cmdarg.Arg:
  39. err := loadFiles(v, target, converter)
  40. if err != nil {
  41. return err
  42. }
  43. case []byte:
  44. err := loadBytes(v, target, converter)
  45. if err != nil {
  46. return err
  47. }
  48. case io.Reader:
  49. err := loadReader(v, target, converter)
  50. if err != nil {
  51. return err
  52. }
  53. default:
  54. return newError("unknown merge input type")
  55. }
  56. return nil
  57. }
  58. }
  59. func loadFiles(files []string, target map[string]interface{}, converter func(v []byte) ([]byte, error)) error {
  60. for _, file := range files {
  61. err := loadFile(file, target, converter)
  62. if err != nil {
  63. return err
  64. }
  65. }
  66. return nil
  67. }
  68. func loadFile(file string, target map[string]interface{}, converter func(v []byte) ([]byte, error)) error {
  69. bs, err := cmdarg.LoadArgToBytes(file)
  70. if err != nil {
  71. return fmt.Errorf("fail to load %s: %s", file, err)
  72. }
  73. if converter != nil {
  74. bs, err = converter(bs)
  75. if err != nil {
  76. return fmt.Errorf("error convert to json '%s': %s", file, err)
  77. }
  78. }
  79. _, err = merge.ToMap(bs, target)
  80. return err
  81. }
  82. func loadReader(reader io.Reader, target map[string]interface{}, converter func(v []byte) ([]byte, error)) error {
  83. bs, err := io.ReadAll(reader)
  84. if err != nil {
  85. return err
  86. }
  87. return loadBytes(bs, target, converter)
  88. }
  89. func loadBytes(bs []byte, target map[string]interface{}, converter func(v []byte) ([]byte, error)) error {
  90. var err error
  91. if converter != nil {
  92. bs, err = converter(bs)
  93. if err != nil {
  94. return fmt.Errorf("fail to convert to json: %s", err)
  95. }
  96. }
  97. _, err = merge.ToMap(bs, target)
  98. return err
  99. }