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

     1  package functions
     2  
     3  import "sort"
     4  
     5  func Intersection(args ...interface{}) interface{} {
     6  
     7  	if args == nil || len(args) < 2 {
     8  		return []interface{}{}
     9  	}
    10  
    11  	switch args[0].(type) {
    12  	case map[string]interface{}:
    13  		return intersectionMap(args...)
    14  	case interface{}:
    15  		return intersectionArray(args...)
    16  	}
    17  
    18  	return []interface{}{}
    19  }
    20  
    21  func intersectionArray(args ...interface{}) interface{} {
    22  	result := []interface{}{}
    23  	hash := make(map[interface{}]bool)
    24  
    25  	for _, arg := range args[0].([]interface{}) {
    26  		hash[arg] = true
    27  	}
    28  
    29  	for i := 1; i < len(args); i++ {
    30  		workingHash := make(map[interface{}]bool)
    31  		argArr, ok := args[i].([]interface{})
    32  		if !ok {
    33  			continue
    34  		}
    35  		for _, item := range argArr {
    36  			if _, ok := hash[item]; ok {
    37  				workingHash[item] = true
    38  			}
    39  		}
    40  		hash = workingHash
    41  	}
    42  
    43  	for k := range hash {
    44  		result = append(result, k)
    45  	}
    46  
    47  	sort.Slice(result, func(i, j int) bool {
    48  		return result[i].(string) < result[j].(string)
    49  	})
    50  
    51  	return result
    52  }
    53  
    54  func intersectionMap(args ...interface{}) interface{} {
    55  	hash := make(map[string]interface{})
    56  
    57  	for k, v := range args[0].(map[string]interface{}) {
    58  		hash[k] = v
    59  	}
    60  
    61  	for i := 1; i < len(args); i++ {
    62  		workingHash := make(map[string]interface{})
    63  		argArr, ok := args[i].(map[string]interface{})
    64  		if !ok {
    65  			continue
    66  		}
    67  		for k, v := range argArr {
    68  			if ev, ok := hash[k]; ok && ev == v {
    69  				workingHash[k] = v
    70  			}
    71  		}
    72  		hash = workingHash
    73  	}
    74  
    75  	return hash
    76  }