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