package generators import ( maps0 "maps" "reflect" ) // MergeMapsMany merges many maps into a new map func MergeMapsMany(maps ...interface{}) map[string][]string { m := make(map[string][]string) for _, gotMap := range maps { val := reflect.ValueOf(gotMap) if val.Kind() != reflect.Map { continue } appendToSlice := func(key, value string) { if values, ok := m[key]; !ok { m[key] = []string{value} } else { m[key] = append(values, value) } } for _, e := range val.MapKeys() { v := val.MapIndex(e) switch v.Kind() { case reflect.Slice, reflect.Array: for i := 0; i < v.Len(); i++ { appendToSlice(e.String(), v.Index(i).String()) } case reflect.String: appendToSlice(e.String(), v.String()) case reflect.Interface: switch data := v.Interface().(type) { case string: appendToSlice(e.String(), data) case []string: for _, value := range data { appendToSlice(e.String(), value) } } } } } return m } // MergeMaps merges two maps into a new map func MergeMaps(maps ...map[string]interface{}) map[string]interface{} { merged := make(map[string]interface{}) for _, m := range maps { maps0.Copy(merged, m) } return merged } // ExpandMapValues converts values from flat string to string slice func ExpandMapValues(m map[string]string) map[string][]string { m1 := make(map[string][]string, len(m)) for k, v := range m { m1[k] = []string{v} } return m1 }