github.com/ShaleApps/viper@v1.15.1-concurrent/internal/encoding/dotenv/map_utils.go (about) 1 package dotenv 2 3 import ( 4 "strings" 5 6 "github.com/spf13/cast" 7 ) 8 9 // flattenAndMergeMap recursively flattens the given map into a new map 10 // Code is based on the function with the same name in tha main package. 11 // TODO: move it to a common place 12 func flattenAndMergeMap(shadow map[string]interface{}, m map[string]interface{}, prefix string, delimiter string) map[string]interface{} { 13 if shadow != nil && prefix != "" && shadow[prefix] != nil { 14 // prefix is shadowed => nothing more to flatten 15 return shadow 16 } 17 if shadow == nil { 18 shadow = make(map[string]interface{}) 19 } 20 21 var m2 map[string]interface{} 22 if prefix != "" { 23 prefix += delimiter 24 } 25 for k, val := range m { 26 fullKey := prefix + k 27 switch val.(type) { 28 case map[string]interface{}: 29 m2 = val.(map[string]interface{}) 30 case map[interface{}]interface{}: 31 m2 = cast.ToStringMap(val) 32 default: 33 // immediate value 34 shadow[strings.ToLower(fullKey)] = val 35 continue 36 } 37 // recursively merge to shadow map 38 shadow = flattenAndMergeMap(shadow, m2, fullKey, delimiter) 39 } 40 return shadow 41 }