diff --git a/lang/funcs/defaults.go b/lang/funcs/defaults.go index 0366ea661..0f9a8eb12 100644 --- a/lang/funcs/defaults.go +++ b/lang/funcs/defaults.go @@ -127,9 +127,11 @@ func defaultsApply(input, fallback cty.Value) cty.Value { case wantTy.IsMapType(): newVals := map[string]cty.Value{} - for it := input.ElementIterator(); it.Next(); { - k, v := it.Element() - newVals[k.AsString()] = defaultsApply(v, fallback) + if !input.IsNull() { + for it := input.ElementIterator(); it.Next(); { + k, v := it.Element() + newVals[k.AsString()] = defaultsApply(v, fallback) + } } if len(newVals) == 0 { @@ -139,10 +141,12 @@ func defaultsApply(input, fallback cty.Value) cty.Value { case wantTy.IsListType(), wantTy.IsSetType(): var newVals []cty.Value - for it := input.ElementIterator(); it.Next(); { - _, v := it.Element() - newV := defaultsApply(v, fallback) - newVals = append(newVals, newV) + if !input.IsNull() { + for it := input.ElementIterator(); it.Next(); { + _, v := it.Element() + newV := defaultsApply(v, fallback) + newVals = append(newVals, newV) + } } if len(newVals) == 0 { diff --git a/lang/funcs/defaults_test.go b/lang/funcs/defaults_test.go index ca0c3be65..efa5c1c9b 100644 --- a/lang/funcs/defaults_test.go +++ b/lang/funcs/defaults_test.go @@ -370,6 +370,25 @@ func TestDefaults(t *testing.T) { Defaults: cty.StringVal("hello"), WantErr: `only object types and collections of object types can have defaults applied`, }, + // When applying default values to collection types, null collections in the + // input should result in empty collections in the output. + { + Input: cty.ObjectVal(map[string]cty.Value{ + "a": cty.NullVal(cty.List(cty.String)), + "b": cty.NullVal(cty.Map(cty.String)), + "c": cty.NullVal(cty.Set(cty.String)), + }), + Defaults: cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("hello"), + "b": cty.StringVal("hi"), + "c": cty.StringVal("greetings"), + }), + Want: cty.ObjectVal(map[string]cty.Value{ + "a": cty.ListValEmpty(cty.String), + "b": cty.MapValEmpty(cty.String), + "c": cty.SetValEmpty(cty.String), + }), + }, } for _, test := range tests {