Skip to content

Commit

Permalink
better error msg
Browse files Browse the repository at this point in the history
  • Loading branch information
aq17 committed Nov 30, 2022
1 parent 7afac76 commit f076351
Showing 1 changed file with 17 additions and 10 deletions.
27 changes: 17 additions & 10 deletions pkg/codegen/pcl/binder_schema.go
Expand Up @@ -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)

Expand All @@ -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
}
}

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit f076351

Please sign in to comment.