github.imxd.top/hashicorp/consul@v1.4.5/agent/config/patch_hcl.go (about) 1 package config 2 3 import ( 4 "fmt" 5 ) 6 7 func patchSliceOfMaps(m map[string]interface{}, skip []string) map[string]interface{} { 8 return patchValue("", m, skip).(map[string]interface{}) 9 } 10 11 func patchValue(name string, v interface{}, skip []string) interface{} { 12 // fmt.Printf("%q: %T\n", name, v) 13 switch x := v.(type) { 14 case map[string]interface{}: 15 if len(x) == 0 { 16 return x 17 } 18 mm := make(map[string]interface{}) 19 for k, v := range x { 20 key := k 21 if name != "" { 22 key = name + "." + k 23 } 24 mm[k] = patchValue(key, v, skip) 25 } 26 return mm 27 28 case []interface{}: 29 if len(x) == 0 { 30 return nil 31 } 32 if strSliceContains(name, skip) { 33 for i, y := range x { 34 x[i] = patchValue(name, y, skip) 35 } 36 return x 37 } 38 if _, ok := x[0].(map[string]interface{}); !ok { 39 return x 40 } 41 if len(x) > 1 { 42 panic(fmt.Sprintf("%s: []map[string]interface{} with more than one element not supported: %s", name, v)) 43 } 44 return patchValue(name, x[0], skip) 45 46 case []map[string]interface{}: 47 if len(x) == 0 { 48 return nil 49 } 50 if strSliceContains(name, skip) { 51 for i, y := range x { 52 x[i] = patchValue(name, y, skip).(map[string]interface{}) 53 } 54 return x 55 } 56 if len(x) > 1 { 57 panic(fmt.Sprintf("%s: []map[string]interface{} with more than one element not supported: %s", name, v)) 58 } 59 return patchValue(name, x[0], skip) 60 61 default: 62 return v 63 } 64 } 65 66 func strSliceContains(s string, v []string) bool { 67 for _, vv := range v { 68 if s == vv { 69 return true 70 } 71 } 72 return false 73 }