merge.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright 2020 Jebbs. All rights reserved.
  2. // Use of this source code is governed by MIT
  3. // license that can be found in the LICENSE file.
  4. /*
  5. Package merge provides the capbility to merge multiple
  6. JSON files or contents into one output.
  7. Merge Rules:
  8. - Simple values (string, number, boolean) are overwritten, others are merged
  9. - Elements with same "tag" (or "_tag") in an array will be merged
  10. - Add "_priority" property to array elements will help sort the
  11. */
  12. package merge
  13. import (
  14. "bytes"
  15. "encoding/json"
  16. )
  17. // FilesToJSON merges multiple jsons files into one json, accepts remote url, or local file path
  18. func FilesToJSON(args []string) ([]byte, error) {
  19. m, err := FilesToMap(args)
  20. if err != nil {
  21. return nil, err
  22. }
  23. return json.Marshal(m)
  24. }
  25. // BytesToJSON merges multiple json contents into one json.
  26. func BytesToJSON(args [][]byte) ([]byte, error) {
  27. m, err := BytesToMap(args)
  28. if err != nil {
  29. return nil, err
  30. }
  31. return json.Marshal(m)
  32. }
  33. // FilesToMap merges multiple json files into one map, accepts remote url, or local file path
  34. func FilesToMap(args []string) (m map[string]interface{}, err error) {
  35. m, err = loadFiles(args)
  36. if err != nil {
  37. return nil, err
  38. }
  39. err = applyRules(m)
  40. if err != nil {
  41. return nil, err
  42. }
  43. return m, nil
  44. }
  45. // BytesToMap merges multiple json contents into one map.
  46. func BytesToMap(args [][]byte) (m map[string]interface{}, err error) {
  47. m, err = loadBytes(args)
  48. if err != nil {
  49. return nil, err
  50. }
  51. err = applyRules(m)
  52. if err != nil {
  53. return nil, err
  54. }
  55. return m, nil
  56. }
  57. func loadFiles(args []string) (map[string]interface{}, error) {
  58. conf := make(map[string]interface{})
  59. for _, arg := range args {
  60. r, err := loadArg(arg)
  61. if err != nil {
  62. return nil, err
  63. }
  64. m, err := decode(r)
  65. if err != nil {
  66. return nil, err
  67. }
  68. if err = mergeMaps(conf, m); err != nil {
  69. return nil, err
  70. }
  71. }
  72. return conf, nil
  73. }
  74. func loadBytes(args [][]byte) (map[string]interface{}, error) {
  75. conf := make(map[string]interface{})
  76. for _, arg := range args {
  77. r := bytes.NewReader(arg)
  78. m, err := decode(r)
  79. if err != nil {
  80. return nil, err
  81. }
  82. if err = mergeMaps(conf, m); err != nil {
  83. return nil, err
  84. }
  85. }
  86. return conf, nil
  87. }