rules.go 1.3 KB

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