github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/azure/arm/parser/armjson/decode.go (about) 1 package armjson 2 3 import ( 4 "fmt" 5 "reflect" 6 7 "github.com/khulnasoft-lab/defsec/pkg/types" 8 ) 9 10 func (n *node) Decode(target interface{}) error { 11 v := reflect.ValueOf(target) 12 return n.decodeToValue(v) 13 } 14 15 func (n *node) Metadata() types.Metadata { 16 return *n.metadata 17 } 18 19 var unmarshaller = reflect.TypeOf((*Unmarshaller)(nil)).Elem() 20 var receiver = reflect.TypeOf((*MetadataReceiver)(nil)).Elem() 21 22 func (n *node) decodeToValue(v reflect.Value) error { 23 24 if v.Type().Implements(receiver) { 25 rec := v 26 defer func() { 27 rec.MethodByName("SetMetadata").Call([]reflect.Value{reflect.ValueOf(n.metadata)}) 28 }() 29 } 30 if v.Type().Implements(unmarshaller) { 31 returns := v.MethodByName("UnmarshalJSONWithMetadata").Call([]reflect.Value{reflect.ValueOf(n)}) 32 if err := returns[0].Interface(); err != nil { 33 return err.(error) 34 } 35 return nil 36 } 37 38 for v.Kind() == reflect.Ptr { 39 v = v.Elem() 40 } 41 42 if !v.CanSet() { 43 return fmt.Errorf("target is not settable") 44 } 45 46 switch n.kind { 47 case KindObject: 48 return n.decodeObject(v) 49 case KindArray: 50 return n.decodeArray(v) 51 case KindString: 52 return n.decodeString(v) 53 case KindNumber: 54 return n.decodeNumber(v) 55 case KindBoolean: 56 return n.decodeBoolean(v) 57 case KindNull: 58 return n.decodeNull(v) 59 case KindComment: 60 return n.decodeString(v) 61 case KindUnknown: 62 return fmt.Errorf("cannot decode unknown kind") 63 default: 64 return fmt.Errorf("decoding of kind 0x%x is not supported", n.kind) 65 } 66 }