github.com/projectdiscovery/nuclei/v2@v2.9.15/pkg/protocols/common/generators/maps.go (about) 1 package generators 2 3 import ( 4 "reflect" 5 ) 6 7 // MergeMapsMany merges many maps into a new map 8 func MergeMapsMany(maps ...interface{}) map[string][]string { 9 m := make(map[string][]string) 10 for _, gotMap := range maps { 11 val := reflect.ValueOf(gotMap) 12 if val.Kind() != reflect.Map { 13 continue 14 } 15 appendToSlice := func(key, value string) { 16 if values, ok := m[key]; !ok { 17 m[key] = []string{value} 18 } else { 19 m[key] = append(values, value) 20 } 21 } 22 for _, e := range val.MapKeys() { 23 v := val.MapIndex(e) 24 switch v.Kind() { 25 case reflect.Slice, reflect.Array: 26 for i := 0; i < v.Len(); i++ { 27 appendToSlice(e.String(), v.Index(i).String()) 28 } 29 case reflect.String: 30 appendToSlice(e.String(), v.String()) 31 case reflect.Interface: 32 switch data := v.Interface().(type) { 33 case string: 34 appendToSlice(e.String(), data) 35 case []string: 36 for _, value := range data { 37 appendToSlice(e.String(), value) 38 } 39 } 40 } 41 } 42 } 43 return m 44 } 45 46 // MergeMaps merges two maps into a new map 47 func MergeMaps(maps ...map[string]interface{}) map[string]interface{} { 48 merged := make(map[string]interface{}) 49 for _, m := range maps { 50 for k, v := range m { 51 merged[k] = v 52 } 53 } 54 return merged 55 } 56 57 // ExpandMapValues converts values from flat string to string slice 58 func ExpandMapValues(m map[string]string) map[string][]string { 59 m1 := make(map[string][]string, len(m)) 60 for k, v := range m { 61 m1[k] = []string{v} 62 } 63 return m1 64 }