config_load.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package helpers
  2. import (
  3. "bytes"
  4. "os"
  5. "github.com/v2fly/v2ray-core/v4/infra/conf"
  6. "github.com/v2fly/v2ray-core/v4/infra/conf/merge"
  7. "github.com/v2fly/v2ray-core/v4/infra/conf/mergers"
  8. "github.com/v2fly/v2ray-core/v4/infra/conf/serial"
  9. )
  10. // LoadConfig load config files to *conf.Config, it will:
  11. // - resolve folder to files
  12. // - try to read stdin if no file specified
  13. func LoadConfig(files []string, format string, recursively bool) (*conf.Config, error) {
  14. m, err := LoadConfigToMap(files, format, recursively)
  15. if err != nil {
  16. return nil, err
  17. }
  18. bs, err := merge.FromMap(m)
  19. if err != nil {
  20. return nil, err
  21. }
  22. r := bytes.NewReader(bs)
  23. return serial.DecodeJSONConfig(r)
  24. }
  25. // LoadConfigToMap load config files to map, it will:
  26. // - resolve folder to files
  27. // - try to read stdin if no file specified
  28. func LoadConfigToMap(files []string, format string, recursively bool) (map[string]interface{}, error) {
  29. var err error
  30. if len(files) > 0 {
  31. var extensions []string
  32. extensions, err := mergers.GetExtensions(format)
  33. if err != nil {
  34. return nil, err
  35. }
  36. files, err = ResolveFolderToFiles(files, extensions, recursively)
  37. if err != nil {
  38. return nil, err
  39. }
  40. }
  41. m := make(map[string]interface{})
  42. if len(files) == 0 {
  43. err = mergers.MergeAs(format, os.Stdin, m)
  44. } else {
  45. err = mergers.MergeAs(format, files, m)
  46. }
  47. if err != nil {
  48. return nil, err
  49. }
  50. return m, nil
  51. }