package generators import ( "reflect" "strings" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/marker" ) // 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 { for k, v := range m { merged[k] = v } } 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 } // CopyMap creates a new copy of an existing map func CopyMap(originalMap map[string]interface{}) map[string]interface{} { newMap := make(map[string]interface{}) for key, value := range originalMap { newMap[key] = value } return newMap } // CopyMapWithDefaultValue creates a new copy of an existing map and set a default value func CopyMapWithDefaultValue(originalMap map[string][]string, defaultValue interface{}) map[string]interface{} { newMap := make(map[string]interface{}) for key := range originalMap { newMap[key] = defaultValue } return newMap } // TrimDelimiters removes trailing brackets func TrimDelimiters(s string) string { return strings.TrimSuffix(strings.TrimPrefix(s, marker.ParenthesisOpen), marker.ParenthesisClose) }