map.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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. import (
  6. "fmt"
  7. )
  8. // mergeMaps merges source map into target
  9. // it supports only map[string]interface{} type for any children of the map tree
  10. func mergeMaps(target map[string]interface{}, source map[string]interface{}) (err error) {
  11. for key, value := range source {
  12. target[key], err = mergeField(target[key], value)
  13. if err != nil {
  14. return
  15. }
  16. }
  17. return
  18. }
  19. func mergeField(target interface{}, source interface{}) (interface{}, error) {
  20. if source == nil {
  21. return target, nil
  22. }
  23. if target == nil {
  24. return source, nil
  25. }
  26. if slice, ok := source.([]interface{}); ok {
  27. if tslice, ok := target.([]interface{}); ok {
  28. tslice = append(tslice, slice...)
  29. return tslice, nil
  30. }
  31. return nil, fmt.Errorf("value type mismatch, source is 'slice' but target not: %s", source)
  32. } else if smap, ok := source.(map[string]interface{}); ok {
  33. if tmap, ok := target.(map[string]interface{}); ok {
  34. err := mergeMaps(tmap, smap)
  35. return tmap, err
  36. }
  37. return nil, fmt.Errorf("value type mismatch, source is 'map[string]interface{}' but target not: %s", source)
  38. }
  39. return source, nil
  40. }