github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/azure/functions/union.go (about)

     1  package functions
     2  
     3  import "sort"
     4  
     5  func Union(args ...interface{}) interface{} {
     6  	if len(args) == 0 {
     7  		return []interface{}{}
     8  	}
     9  	if len(args) == 1 {
    10  		return args[0]
    11  	}
    12  
    13  	switch args[0].(type) {
    14  	case map[string]interface{}:
    15  		return unionMap(args...)
    16  	case interface{}:
    17  		return unionArray(args...)
    18  	}
    19  
    20  	return []interface{}{}
    21  
    22  }
    23  
    24  func unionMap(args ...interface{}) interface{} {
    25  	result := make(map[string]interface{})
    26  
    27  	for _, arg := range args {
    28  		switch iType := arg.(type) {
    29  		case map[string]interface{}:
    30  			for k, v := range iType {
    31  				result[k] = v
    32  			}
    33  		}
    34  	}
    35  
    36  	return result
    37  }
    38  
    39  func unionArray(args ...interface{}) interface{} {
    40  	result := []interface{}{}
    41  	union := make(map[interface{}]bool)
    42  
    43  	for _, arg := range args {
    44  		switch iType := arg.(type) {
    45  		case []interface{}:
    46  			for _, item := range iType {
    47  				union[item] = true
    48  			}
    49  		}
    50  	}
    51  
    52  	for k := range union {
    53  		result = append(result, k)
    54  	}
    55  	sort.Slice(result, func(i, j int) bool {
    56  		return result[i].(string) < result[j].(string)
    57  	})
    58  
    59  	return result
    60  }