github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/rego/convert/anonymous.go (about)

     1  package convert
     2  
     3  import (
     4  	"reflect"
     5  )
     6  
     7  var converterInterface = reflect.TypeOf((*Converter)(nil)).Elem()
     8  
     9  func anonymousToRego(inputValue reflect.Value) interface{} {
    10  
    11  	if inputValue.IsZero() {
    12  		return nil
    13  	}
    14  
    15  	for inputValue.Type().Kind() == reflect.Interface {
    16  		if inputValue.IsNil() {
    17  			return nil
    18  		}
    19  		inputValue = inputValue.Elem()
    20  	}
    21  
    22  	if inputValue.Type().Implements(converterInterface) {
    23  		returns := inputValue.MethodByName("ToRego").Call(nil)
    24  		return returns[0].Interface()
    25  	}
    26  
    27  	for inputValue.Type().Kind() == reflect.Ptr {
    28  		if inputValue.IsNil() {
    29  			return nil
    30  		}
    31  		inputValue = inputValue.Elem()
    32  	}
    33  
    34  	if inputValue.Type().Implements(converterInterface) {
    35  		returns := inputValue.MethodByName("ToRego").Call(nil)
    36  		return returns[0].Interface()
    37  	}
    38  
    39  	switch kind := inputValue.Type().Kind(); kind {
    40  	case reflect.Struct:
    41  		return StructToRego(inputValue)
    42  	case reflect.Slice:
    43  		return SliceToRego(inputValue)
    44  	}
    45  
    46  	return nil
    47  }