diff --git a/pkg/codegen/pcl/binder_schema.go b/pkg/codegen/pcl/binder_schema.go index 3f0867a9b76d..9eada9cfd225 100644 --- a/pkg/codegen/pcl/binder_schema.go +++ b/pkg/codegen/pcl/binder_schema.go @@ -499,10 +499,11 @@ func getDiscriminatedUnionObjectItem(t model.Type) (string, model.Type) { // no member if found, (nil, true) returned. If the query is nonsensical, either // because no schema is associated with the EnumMember or if the type of value // mismatches the type of the schema, (nil, false) is returned. -func EnumMember(t *model.EnumType, value cty.Value) (*schema.Enum, bool) { +func EnumMember(t *model.EnumType, value cty.Value) (*schema.Enum, []interface{}, bool) { srcBase, ok := GetSchemaForType(t) + validMembers := make([]interface{}, 0) if !ok { - return nil, false + return nil, validMembers, false } src := srcBase.(*schema.EnumType) @@ -512,28 +513,31 @@ func EnumMember(t *model.EnumType, value cty.Value) (*schema.Enum, bool) { for _, el := range src.Elements { v := el.Value.(string) if v == s { - return el, true + return el, validMembers, true } + validMembers = append(validMembers, v) } - return nil, true + return nil, validMembers, true case t.Type.Equals(model.NumberType): f, _ := value.AsBigFloat().Float64() for _, el := range src.Elements { if el.Value.(float64) == f { - return el, true + return el, validMembers, true } + validMembers = append(validMembers, f) } - return nil, true + return nil, validMembers, true case t.Type.Equals(model.IntType): f, _ := value.AsBigFloat().Int64() for _, el := range src.Elements { if el.Value.(int64) == f { - return el, true + return el, validMembers, true } + validMembers = append(validMembers, f) } - return nil, true + return nil, validMembers, true default: - return nil, false + return nil, validMembers, false } } @@ -562,10 +566,13 @@ func GenEnum( if known != cty.NilVal { // If the value is known, but we can't find a member, we should have // indicated a conversion is impossible when type checking. - member, ok := EnumMember(t, known) + member, validMembers, ok := EnumMember(t, known) contract.Assertf(ok, "We have determined %s is a safe enum, which we define as "+ "being able to calculate a member for", t) + if member == nil { + contract.Failf("Invalid enum provided: valid values are %v", validMembers) + } safeEnum(member) } else { unsafeEnum(from)