merger_base.go 2.4 KB

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