github.com/openfga/openfga@v1.5.4-rc1/internal/condition/types/generic.go (about)

     1  package types
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/google/cel-go/cel"
     7  	openfgav1 "github.com/openfga/api/proto/openfga/v1"
     8  )
     9  
    10  func mapTypeConverterFunc(genericTypes []ParameterType) ParameterType {
    11  	return ParameterType{
    12  		name:         openfgav1.ConditionParamTypeRef_TYPE_NAME_MAP,
    13  		celType:      cel.MapType(cel.StringType, genericTypes[0].celType),
    14  		genericTypes: genericTypes,
    15  		typedParamConverter: func(value any) (any, error) {
    16  			v, ok := value.(map[string]any)
    17  			if !ok {
    18  				return nil, fmt.Errorf("map requires a map, found: %T", value)
    19  			}
    20  
    21  			converted := make(map[string]any, len(v))
    22  			for key, item := range v {
    23  				convertedItem, err := genericTypes[0].ConvertValue(item)
    24  				if err != nil {
    25  					return nil, fmt.Errorf("found an invalid value for key '%s': %w", key, err)
    26  				}
    27  
    28  				converted[key] = convertedItem
    29  			}
    30  
    31  			return converted, nil
    32  		},
    33  	}
    34  }
    35  
    36  func listTypeConverterFunc(genericTypes []ParameterType) ParameterType {
    37  	return ParameterType{
    38  		name:         openfgav1.ConditionParamTypeRef_TYPE_NAME_LIST,
    39  		celType:      cel.ListType(genericTypes[0].celType),
    40  		genericTypes: genericTypes,
    41  		typedParamConverter: func(value any) (any, error) {
    42  			v, ok := value.([]any)
    43  			if !ok {
    44  				return nil, fmt.Errorf("list requires a list, found: %T", value)
    45  			}
    46  
    47  			converted := make([]any, len(v))
    48  			for index, item := range v {
    49  				convertedItem, err := genericTypes[0].ConvertValue(item)
    50  				if err != nil {
    51  					return nil, fmt.Errorf("found an invalid list item at index `%d`: %w", index, err)
    52  				}
    53  
    54  				converted[index] = convertedItem
    55  			}
    56  
    57  			return converted, nil
    58  		},
    59  	}
    60  }