diff --git a/changelog/pending/20221201--programgen--improve-error-message-for-invalid-enum-values-on-pulumi-convert.yaml b/changelog/pending/20221201--programgen--improve-error-message-for-invalid-enum-values-on-pulumi-convert.yaml new file mode 100644 index 000000000000..ec1617a13af5 --- /dev/null +++ b/changelog/pending/20221201--programgen--improve-error-message-for-invalid-enum-values-on-pulumi-convert.yaml @@ -0,0 +1,4 @@ +changes: +- type: chore + scope: programgen + description: Improve error message for invalid enum values on `pulumi convert`. diff --git a/pkg/codegen/dotnet/gen_program_expressions.go b/pkg/codegen/dotnet/gen_program_expressions.go index 9530697148ac..65b04e40841c 100644 --- a/pkg/codegen/dotnet/gen_program_expressions.go +++ b/pkg/codegen/dotnet/gen_program_expressions.go @@ -337,7 +337,7 @@ func (g *generator) genIntrensic(w io.Writer, from model.Expression, to model.Ty } else { pcl.GenEnum(to, from, g.genSafeEnum(w, to), func(from model.Expression) { g.Fgenf(w, "%s(%v)", convertFn, from) - }) + }, &g.diagnostics) } default: g.Fgenf(w, "%.v", from) // <- probably wrong w.r.t. precedence diff --git a/pkg/codegen/go/gen_program_expressions.go b/pkg/codegen/go/gen_program_expressions.go index a116d3eb3332..7743fa15ec99 100644 --- a/pkg/codegen/go/gen_program_expressions.go +++ b/pkg/codegen/go/gen_program_expressions.go @@ -207,7 +207,7 @@ func (g *generator) GenFunctionCallExpression(w io.Writer, expr *model.FunctionC } pcl.GenEnum(to, from, g.genSafeEnum(w, to), func(from model.Expression) { g.Fgenf(w, "%s(%v)", enumTag, from) - }) + }, &g.diagnostics) return } switch arg := from.(type) { diff --git a/pkg/codegen/nodejs/gen_program_expressions.go b/pkg/codegen/nodejs/gen_program_expressions.go index 94f9bc9a8438..83a56f0d7b28 100644 --- a/pkg/codegen/nodejs/gen_program_expressions.go +++ b/pkg/codegen/nodejs/gen_program_expressions.go @@ -342,7 +342,7 @@ func (g *generator) GenFunctionCallExpression(w io.Writer, expr *model.FunctionC g.Fgenf(w, "%s.%s", enum, memberTag) }, func(from model.Expression) { g.Fgenf(w, "%s[%.v]", enum, from) - }) + }, &g.diagnostics) } } else { g.Fgenf(w, "%v", from) diff --git a/pkg/codegen/pcl/binder_schema.go b/pkg/codegen/pcl/binder_schema.go index 3f0867a9b76d..73dfb146d880 100644 --- a/pkg/codegen/pcl/binder_schema.go +++ b/pkg/codegen/pcl/binder_schema.go @@ -549,6 +549,7 @@ func GenEnum( from model.Expression, safeEnum func(member *schema.Enum), unsafeEnum func(from model.Expression), + diags *hcl.Diagnostics, ) { known := cty.NilVal if from, ok := from.(*model.TemplateExpression); ok && len(from.Parts) == 1 { @@ -566,7 +567,15 @@ func GenEnum( contract.Assertf(ok, "We have determined %s is a safe enum, which we define as "+ "being able to calculate a member for", t) - safeEnum(member) + if member != nil { + safeEnum(member) + } else { + unsafeEnum(from) + *diags = append(*diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: fmt.Sprintf("\"%v\" is an invalid enum value.", known.AsString()), + }) + } } else { unsafeEnum(from) } diff --git a/pkg/codegen/python/gen_program_expressions.go b/pkg/codegen/python/gen_program_expressions.go index 7a2cb9a3698d..59f75d83319f 100644 --- a/pkg/codegen/python/gen_program_expressions.go +++ b/pkg/codegen/python/gen_program_expressions.go @@ -257,7 +257,7 @@ func (g *generator) GenFunctionCallExpression(w io.Writer, expr *model.FunctionC g.Fgenf(w, "%s.%s.%s", pkg, enumName, tag) }, func(from model.Expression) { g.Fgenf(w, "%s.%s(%.v)", pkg, enumName, from) - }) + }, &g.diagnostics) } default: switch arg := from.(type) {