github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/azure/arm/parser/armjson/decode_array.go (about)

     1  package armjson
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  )
     7  
     8  func (n *node) decodeArray(v reflect.Value) error {
     9  
    10  	length := len(n.content)
    11  
    12  	var original reflect.Value
    13  
    14  	switch v.Kind() {
    15  	case reflect.Array:
    16  		if v.Len() != length {
    17  			return fmt.Errorf("invalid length")
    18  		}
    19  	case reflect.Slice:
    20  		v.Set(reflect.MakeSlice(v.Type(), length, length))
    21  	case reflect.Interface:
    22  		original = v
    23  		slice := reflect.ValueOf(make([]interface{}, length))
    24  		v = reflect.New(slice.Type()).Elem()
    25  		v.Set(slice)
    26  	default:
    27  		return fmt.Errorf("invalid target type")
    28  	}
    29  
    30  	elementType := v.Type().Elem()
    31  	for i, nodeElement := range n.content {
    32  		node := nodeElement.(*node)
    33  		targetElement := reflect.New(elementType).Elem()
    34  		addressable := targetElement
    35  		if targetElement.Kind() == reflect.Ptr {
    36  			targetElement.Set(reflect.New(elementType.Elem()))
    37  		} else {
    38  			addressable = targetElement.Addr()
    39  		}
    40  		if err := node.decodeToValue(addressable); err != nil {
    41  			return err
    42  		}
    43  		v.Index(i).Set(targetElement)
    44  	}
    45  
    46  	if original.IsValid() {
    47  		original.Set(v)
    48  	}
    49  
    50  	return nil
    51  }