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  }