Skip to content

Commit 272b074

Browse files
committed
chore: bad default values should throw errors
1 parent b3576c4 commit 272b074

File tree

7 files changed

+120
-17
lines changed

7 files changed

+120
-17
lines changed

Diff for: cli/clidisplay/resources.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,13 @@ func Parameters(writer io.Writer, params []types.Parameter, files map[string]*hc
7777
//} else {
7878
// strVal = value.GoString()
7979
//}
80+
dp := p.DisplayName
81+
if p.DisplayName == "" {
82+
dp = p.Name
83+
}
8084

8185
tableWriter.AppendRow(table.Row{
82-
fmt.Sprintf("(%s) %s: %s\n%s", p.DisplayName, p.Name, p.Description, formatOptions(selections, p.Options)),
86+
fmt.Sprintf("(%s) %s: %s\n%s", dp, p.Name, p.Description, formatOptions(selections, p.Options)),
8387
})
8488

8589
if hcl.Diagnostics(p.Diagnostics).HasErrors() {

Diff for: extract/parameter.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,12 @@ func ParameterFromBlock(block *terraform.Block) (*types.Parameter, hcl.Diagnosti
173173
}
174174
}
175175

176+
if !diags.HasErrors() {
177+
// Only do this validation if the parameter is valid, as if some errors
178+
// exist, then this is likely to fail be excess information.
179+
diags = diags.Extend(p.Valid())
180+
}
181+
176182
usageDiags := ParameterUsageDiagnostics(p)
177183
if usageDiags.HasErrors() {
178184
p.FormType = provider.ParameterFormTypeError
@@ -243,7 +249,6 @@ func ParameterValidationFromBlock(block *terraform.Block) (types.ParameterValida
243249
Min: nullableInteger(block, "min"),
244250
Max: nullableInteger(block, "max"),
245251
Monotonic: nullableString(block, "monotonic"),
246-
Invalid: nullableBoolean(block, "invalid"),
247252
}
248253

249254
return p, diags

Diff for: go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/aquasecurity/trivy v0.58.2
1010
github.com/coder/guts v1.0.2-0.20250227211802-139809366a22
1111
github.com/coder/serpent v0.10.0
12-
github.com/coder/terraform-provider-coder/v2 v2.4.0-pre0
12+
github.com/coder/terraform-provider-coder/v2 v2.4.0-pre0.0.20250414140516-f66adaca2adf
1313
github.com/coder/websocket v1.8.13
1414
github.com/go-chi/chi v4.1.2+incompatible
1515
github.com/google/uuid v1.6.0

Diff for: go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -718,8 +718,8 @@ github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 h1:3A0ES21Ke+FxEM8CXx
718718
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0/go.mod h1:5UuS2Ts+nTToAMeOjNlnHFkPahrtDkmpydBen/3wgZc=
719719
github.com/coder/serpent v0.10.0 h1:ofVk9FJXSek+SmL3yVE3GoArP83M+1tX+H7S4t8BSuM=
720720
github.com/coder/serpent v0.10.0/go.mod h1:cZFW6/fP+kE9nd/oRkEHJpG6sXCtQ+AX7WMMEHv0Y3Q=
721-
github.com/coder/terraform-provider-coder/v2 v2.4.0-pre0 h1:NPt2+FVr+2QJoxrta5ZwyTaxocWMEKdh2WpIumffxfM=
722-
github.com/coder/terraform-provider-coder/v2 v2.4.0-pre0/go.mod h1:X28s3rz+aEM5PkBKvk3xcUrQFO2eNPjzRChUg9wb70U=
721+
github.com/coder/terraform-provider-coder/v2 v2.4.0-pre0.0.20250414140516-f66adaca2adf h1:h0ZMBLv/NiHeMWANSiUKHZkuxti4zIWCGXAXYF0tuJQ=
722+
github.com/coder/terraform-provider-coder/v2 v2.4.0-pre0.0.20250414140516-f66adaca2adf/go.mod h1:X28s3rz+aEM5PkBKvk3xcUrQFO2eNPjzRChUg9wb70U=
723723
github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE=
724724
github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs=
725725
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=

Diff for: types/convert.go

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package types
2+
3+
import (
4+
"github.com/hashicorp/hcl/v2"
5+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
6+
7+
"github.com/coder/terraform-provider-coder/v2/provider"
8+
)
9+
10+
func providerValidations(vals []*ParameterValidation) []provider.Validation {
11+
cpy := make([]provider.Validation, 0, len(vals))
12+
for _, val := range vals {
13+
cpy = append(cpy, providerValidation(val))
14+
}
15+
return cpy
16+
}
17+
18+
func providerValidation(v *ParameterValidation) provider.Validation {
19+
return provider.Validation{
20+
Min: int(orZero(v.Min)),
21+
MinDisabled: v.Min == nil,
22+
Max: int(orZero(v.Max)),
23+
MaxDisabled: v.Max == nil,
24+
Monotonic: orZero(v.Monotonic),
25+
Regex: orZero(v.Regex),
26+
Error: v.Error,
27+
}
28+
}
29+
30+
func providerOptions(opts []*ParameterOption) []provider.Option {
31+
cpy := make([]provider.Option, 0, len(opts))
32+
for _, opt := range opts {
33+
cpy = append(cpy, providerOption(opt))
34+
}
35+
return cpy
36+
}
37+
38+
func providerOption(opt *ParameterOption) provider.Option {
39+
return provider.Option{
40+
Name: opt.Name,
41+
Description: opt.Description,
42+
Value: opt.Value.AsString(),
43+
Icon: opt.Icon,
44+
}
45+
}
46+
47+
func hclDiagnostics(diagnostics diag.Diagnostics) hcl.Diagnostics {
48+
cpy := make(hcl.Diagnostics, 0, len(diagnostics))
49+
for _, d := range diagnostics {
50+
cpy = append(cpy, hclDiagnostic(d))
51+
}
52+
return cpy
53+
}
54+
55+
func hclDiagnostic(d diag.Diagnostic) *hcl.Diagnostic {
56+
sev := hcl.DiagInvalid
57+
switch d.Severity {
58+
case diag.Error:
59+
sev = hcl.DiagError
60+
case diag.Warning:
61+
sev = hcl.DiagWarning
62+
}
63+
return &hcl.Diagnostic{
64+
Severity: sev,
65+
Summary: d.Summary,
66+
Detail: d.Detail,
67+
Subject: nil,
68+
Context: nil,
69+
Expression: nil,
70+
EvalContext: nil,
71+
Extra: nil,
72+
}
73+
}

Diff for: types/enum.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ package types
33
import (
44
"fmt"
55
"strings"
6+
7+
"github.com/coder/terraform-provider-coder/v2/provider"
68
)
79

8-
type ParameterType string
10+
// TODO: Just use the provider type directly.
11+
type ParameterType provider.OptionType
912

1013
const (
1114
ParameterTypeString ParameterType = "string"

Diff for: types/parameter.go

+29-11
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77

88
"github.com/aquasecurity/trivy/pkg/iac/terraform"
9+
"github.com/hashicorp/hcl/v2"
910
"github.com/zclconf/go-cty/cty"
1011

1112
"github.com/coder/terraform-provider-coder/v2/provider"
@@ -73,24 +74,16 @@ type ParameterValidation struct {
7374
Min *int64 `json:"validation_min"`
7475
Max *int64 `json:"validation_max"`
7576
Monotonic *string `json:"validation_monotonic"`
76-
Invalid *bool `json:"validation_invalid"`
7777
}
7878

7979
// Valid takes the type of the value and the value itself and returns an error
8080
// if the value is invalid.
81-
func (v ParameterValidation) Valid(typ string, value string) error {
81+
func (v *ParameterValidation) Valid(typ string, value string) error {
8282
// TODO: Validate typ is the enum?
8383
// Use the provider.Validation struct to validate the value to be
8484
// consistent with the provider.
85-
return (&provider.Validation{
86-
Min: int(orZero(v.Min)),
87-
MinDisabled: v.Min == nil,
88-
Max: int(orZero(v.Max)),
89-
MaxDisabled: v.Max == nil,
90-
Monotonic: orZero(v.Monotonic),
91-
Regex: orZero(v.Regex),
92-
Error: v.Error,
93-
}).Valid(provider.OptionType(typ), value)
85+
pv := providerValidation(v)
86+
return (&pv).Valid(provider.OptionType(typ), value)
9487
}
9588

9689
type ParameterOption struct {
@@ -100,6 +93,31 @@ type ParameterOption struct {
10093
Icon string `json:"icon"`
10194
}
10295

96+
func (r *ParameterData) Valid() hcl.Diagnostics {
97+
diag := (&provider.Parameter{
98+
Name: r.Name,
99+
DisplayName: r.DisplayName,
100+
Description: r.Description,
101+
Type: provider.OptionType(r.Type),
102+
FormType: r.FormType,
103+
Mutable: r.Mutable,
104+
Default: r.DefaultValue.AsString(),
105+
Icon: r.Icon,
106+
Option: providerOptions(r.Options),
107+
Validation: providerValidations(r.Validations),
108+
Optional: false,
109+
Order: int(r.Order),
110+
Ephemeral: r.Ephemeral,
111+
}).Valid()
112+
113+
if diag.HasError() {
114+
// TODO: We can take the attr path and decorate the error with
115+
// source information.
116+
return hclDiagnostics(diag)
117+
}
118+
return nil
119+
}
120+
103121
// CtyType returns the cty.Type for the ParameterData.
104122
// A fixed set of types are supported.
105123
func (r *ParameterData) CtyType() (cty.Type, error) {

0 commit comments

Comments
 (0)