diff options
| author | Kazuma Watanabe <watassbass@gmail.com> | 2023-08-30 15:05:21 +0000 |
|---|---|---|
| committer | Martin Atkins <mart@degeneration.co.uk> | 2023-08-30 08:39:54 -0700 |
| commit | ed6d4bf93b5d9b862dae35dcd605f4d609d3dd7c (patch) | |
| tree | ff1b9888b0bf96e766b59525921f4dd3e255b156 /ext/typeexpr | |
| parent | a9f8d65cae3cf64e58fc38f85c7970ab62964e8b (diff) | |
ext/typeexpr: Avoid refinements on dynamic values
Diffstat (limited to 'ext/typeexpr')
| -rw-r--r-- | ext/typeexpr/defaults.go | 2 | ||||
| -rw-r--r-- | ext/typeexpr/defaults_test.go | 17 |
2 files changed, 18 insertions, 1 deletions
diff --git a/ext/typeexpr/defaults.go b/ext/typeexpr/defaults.go index 43a2539..d3d6be2 100644 --- a/ext/typeexpr/defaults.go +++ b/ext/typeexpr/defaults.go @@ -95,7 +95,7 @@ func (d *Defaults) apply(v cty.Value) cty.Value { } values[key] = defaultValue } - if defaultRng := defaultValue.Range(); defaultRng.DefinitelyNotNull() { + if defaultRng := defaultValue.Range(); defaultRng.DefinitelyNotNull() && values[key].Type() != cty.DynamicPseudoType { values[key] = values[key].RefineNotNull() } } diff --git a/ext/typeexpr/defaults_test.go b/ext/typeexpr/defaults_test.go index 5f0588f..dc3a3f4 100644 --- a/ext/typeexpr/defaults_test.go +++ b/ext/typeexpr/defaults_test.go @@ -898,6 +898,23 @@ func TestDefaults_Apply(t *testing.T) { "foo": cty.UnknownVal(cty.String).RefineNotNull(), }), }, + "optional attribute with dynamic value can be null": { + defaults: &Defaults{ + Type: cty.ObjectWithOptionalAttrs(map[string]cty.Type{ + "foo": cty.String, + }, []string{"foo"}), + DefaultValues: map[string]cty.Value{ + "foo": cty.StringVal("bar"), // Important: default is non-null + }, + }, + value: cty.ObjectVal(map[string]cty.Value{ + "foo": cty.DynamicVal, + }), + want: cty.ObjectVal(map[string]cty.Value{ + // The default value is itself non-null, but dynamic value cannot be refined. + "foo": cty.DynamicVal, + }), + }, } for name, tc := range testCases { |
