Path: blob/dev/pkg/protocols/common/generators/maps.go
2843 views
package generators12import (3maps0 "maps"4"reflect"5)67// MergeMapsMany merges many maps into a new map8func MergeMapsMany(maps ...interface{}) map[string][]string {9m := make(map[string][]string)10for _, gotMap := range maps {11val := reflect.ValueOf(gotMap)12if val.Kind() != reflect.Map {13continue14}15appendToSlice := func(key, value string) {16if values, ok := m[key]; !ok {17m[key] = []string{value}18} else {19m[key] = append(values, value)20}21}22for _, e := range val.MapKeys() {23v := val.MapIndex(e)24switch v.Kind() {25case reflect.Slice, reflect.Array:26for i := 0; i < v.Len(); i++ {27appendToSlice(e.String(), v.Index(i).String())28}29case reflect.String:30appendToSlice(e.String(), v.String())31case reflect.Interface:32switch data := v.Interface().(type) {33case string:34appendToSlice(e.String(), data)35case []string:36for _, value := range data {37appendToSlice(e.String(), value)38}39}40}41}42}43return m44}4546// MergeMaps merges multiple maps into a new map.47//48// Use [CopyMap] if you need to copy a single map.49// Use [MergeMapsInto] to merge into an existing map.50func MergeMaps(maps ...map[string]interface{}) map[string]interface{} {51mapsLen := 052for _, m := range maps {53mapsLen += len(m)54}5556merged := make(map[string]interface{}, mapsLen)57for _, m := range maps {58maps0.Copy(merged, m)59}6061return merged62}6364// CopyMap creates a shallow copy of a single map.65func CopyMap(m map[string]interface{}) map[string]interface{} {66if m == nil {67return nil68}6970result := make(map[string]interface{}, len(m))71maps0.Copy(result, m)7273return result74}7576// MergeMapsInto copies all entries from src maps into dst (mutating dst).77//78// Use when dst is a fresh map the caller owns and wants to avoid allocation.79func MergeMapsInto(dst map[string]interface{}, srcs ...map[string]interface{}) {80for _, src := range srcs {81maps0.Copy(dst, src)82}83}8485// ExpandMapValues converts values from flat string to string slice86func ExpandMapValues(m map[string]string) map[string][]string {87m1 := make(map[string][]string, len(m))88for k, v := range m {89m1[k] = []string{v}90}9192return m193}949596