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 }