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  }