rules.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. package merge
  5. const (
  6. priorityKey string = "_priority"
  7. tagKey string = "_tag"
  8. )
  9. // ApplyRules applies merge rules according to _tag, _priority fields, and remove them
  10. func ApplyRules(m map[string]interface{}) error {
  11. err := sortMergeSlices(m)
  12. if err != nil {
  13. return err
  14. }
  15. removeHelperFields(m)
  16. return nil
  17. }
  18. // sortMergeSlices enumerates all slices in a map, to sort by priority and merge by tag
  19. func sortMergeSlices(target map[string]interface{}) error {
  20. for key, value := range target {
  21. if slice, ok := value.([]interface{}); ok {
  22. sortByPriority(slice)
  23. s, err := mergeSameTag(slice)
  24. if err != nil {
  25. return err
  26. }
  27. target[key] = s
  28. for _, item := range s {
  29. if m, ok := item.(map[string]interface{}); ok {
  30. sortMergeSlices(m)
  31. }
  32. }
  33. } else if field, ok := value.(map[string]interface{}); ok {
  34. sortMergeSlices(field)
  35. }
  36. }
  37. return nil
  38. }
  39. func removeHelperFields(target map[string]interface{}) {
  40. for key, value := range target {
  41. if key == priorityKey || key == tagKey {
  42. delete(target, key)
  43. } else if slice, ok := value.([]interface{}); ok {
  44. for _, e := range slice {
  45. if el, ok := e.(map[string]interface{}); ok {
  46. removeHelperFields(el)
  47. }
  48. }
  49. } else if field, ok := value.(map[string]interface{}); ok {
  50. removeHelperFields(field)
  51. }
  52. }
  53. }