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 }