Skip to content

Commit

Permalink
configs: Include context when variable default has nested problem
Browse files Browse the repository at this point in the history
Previously this error message was including only the main error message
and ignoring any context about what part of a potential nested data
structure it arose from.

Now we'll use our usual path formatting utility to introduce additional
context whenever a problem arises with a nested value.
  • Loading branch information
apparentlymart committed Jul 16, 2024
1 parent 125cf53 commit 130b356
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 2 deletions.
8 changes: 6 additions & 2 deletions internal/configs/named_values.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/zclconf/go-cty/cty/convert"

"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/tfdiags"
)

// A consistent detail message for all "not a valid identifier" diagnostics.
Expand Down Expand Up @@ -163,8 +164,11 @@ func decodeVariableBlock(block *hcl.Block, override bool) (*Variable, hcl.Diagno
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Invalid default value for variable",
Detail: fmt.Sprintf("This default value is not compatible with the variable's type constraint: %s.", err),
Subject: attr.Expr.Range().Ptr(),
Detail: fmt.Sprintf(
"This default value is not compatible with the variable's type constraint: %s.",
tfdiags.FormatError(err),
),
Subject: attr.Expr.Range().Ptr(),
})
val = cty.DynamicVal
}
Expand Down
47 changes: 47 additions & 0 deletions internal/configs/named_values_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package configs

import (
"testing"

"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/hcl/v2/hclsyntax"
)

func TestVariableInvalidDefault(t *testing.T) {
src := `
variable foo {
type = map(object({
foo = bool
}))
default = {
"thingy" = {
foo = "string where bool is expected"
}
}
}
`

hclF, diags := hclsyntax.ParseConfig([]byte(src), "test.tf", hcl.InitialPos)
if diags.HasErrors() {
t.Fatal(diags.Error())
}

_, diags = parseConfigFile(hclF.Body, nil, false, false)
if !diags.HasErrors() {
t.Fatal("unexpected success; want error")
}

for _, diag := range diags {
if diag.Severity != hcl.DiagError {
continue
}
if diag.Summary != "Invalid default value for variable" {
t.Errorf("unexpected diagnostic summary: %q", diag.Summary)
continue
}
if got, want := diag.Detail, `This default value is not compatible with the variable's type constraint: ["thingy"].foo: a bool is required.`; got != want {
t.Errorf("wrong diagnostic detault\ngot: %s\nwant: %s", got, want)
}
}
}

0 comments on commit 130b356

Please sign in to comment.