Skip to content

Commit

Permalink
feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
aq17 committed Dec 1, 2022
1 parent 3ee08b0 commit 135cae6
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 17 deletions.
@@ -1,4 +1,4 @@
changes:
- type: chore
- type: fix
scope: programgen
description: Improve error message for invalid enum values on `pulumi convert`.
55 changes: 39 additions & 16 deletions pkg/codegen/pcl/binder_schema.go
Expand Up @@ -16,6 +16,7 @@ package pcl

import (
"fmt"
"strings"
"sync"

"github.com/blang/semver"
Expand Down Expand Up @@ -499,11 +500,10 @@ 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, []interface{}, bool) {
validMembers := make([]interface{}, 0)
func EnumMember(t *model.EnumType, value cty.Value) (*schema.Enum, bool) {
srcBase, ok := GetSchemaForType(t)
if !ok {
return nil, validMembers, false
return nil, false
}
src := srcBase.(*schema.EnumType)

Expand All @@ -513,31 +513,28 @@ func EnumMember(t *model.EnumType, value cty.Value) (*schema.Enum, []interface{}
for _, el := range src.Elements {
v := el.Value.(string)
if v == s {
return el, validMembers, true
return el, true
}
validMembers = append(validMembers, v)
}
return nil, validMembers, true
return nil, true
case t.Type.Equals(model.NumberType):
f, _ := value.AsBigFloat().Float64()
for _, el := range src.Elements {
if el.Value.(float64) == f {
return el, validMembers, true
return el, true
}
validMembers = append(validMembers, f)
}
return nil, validMembers, true
return nil, true
case t.Type.Equals(model.IntType):
f, _ := value.AsBigFloat().Int64()
for _, el := range src.Elements {
if el.Value.(int64) == f {
return el, validMembers, true
return el, true
}
validMembers = append(validMembers, f)
}
return nil, validMembers, true
return nil, true
default:
return nil, validMembers, false
return nil, false
}
}

Expand Down Expand Up @@ -566,22 +563,48 @@ 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, validMembers, ok := EnumMember(t, known)
member, 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 {
safeEnum(member)
} else {
unsafeEnum(from)
knownVal := strings.Split(strings.Split(known.GoString(), "(")[1], ")")[0]
return &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: fmt.Sprintf("\"%v\" is not a valid value of the enum \"%v\"", known.GoString(), t.Token),
Detail: fmt.Sprintf("Valid members are: %v", validMembers),
Summary: fmt.Sprintf("%v is not a valid value of the enum \"%v\"", knownVal, t.Token),
Detail: fmt.Sprintf("Valid members are %v", listToString(enumMemberValues(t))),
}
}
} else {
unsafeEnum(from)
}
return nil
}

func enumMemberValues(t *model.EnumType) []interface{} {
srcBase, ok := GetSchemaForType(t)
if !ok {
return nil
}
src := srcBase.(*schema.EnumType)
members := make([]interface{}, len(src.Elements))
for i, el := range src.Elements {
members[i] = el.Value
}
return members
}

func listToString(l []interface{}) string {
vals := ""
for i, v := range l {
if i == 0 {
vals = fmt.Sprintf("\"%v\"", v)
} else {
vals = fmt.Sprintf("%s, \"%v\"", vals, v)
}
}
return vals
}

0 comments on commit 135cae6

Please sign in to comment.