merger_base.go 2.5 KB

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