Skip to content

Commit

Permalink
Strip optional attributes from null objects during conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
liamcervante committed Oct 18, 2022
1 parent 8548fbb commit bd2fd6b
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 1 deletion.
6 changes: 5 additions & 1 deletion cty/convert/conversion_object.go
Expand Up @@ -80,13 +80,17 @@ func conversionObjectToObject(in, out cty.Type, unsafe bool) conversion {
}
}

if val.Equals(cty.NullVal(val.Type())).True() {
val = cty.NullVal(val.Type().WithoutOptionalAttributesDeep())
}

attrVals[name] = val
}

for name := range outOptionals {
if _, exists := attrVals[name]; !exists {
wantTy := outAtys[name]
attrVals[name] = cty.NullVal(wantTy)
attrVals[name] = cty.NullVal(wantTy.WithoutOptionalAttributesDeep())
}
}

Expand Down
98 changes: 98 additions & 0 deletions cty/convert/public_test.go
Expand Up @@ -991,6 +991,104 @@ func TestConvert(t *testing.T) {
}),
WantError: false,
},
{
Value: cty.TupleVal([]cty.Value{
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(10)),
"c": cty.ObjectVal(map[string]cty.Value{
"a": cty.StringVal("foo"),
"b": cty.BoolVal(true),
}),
}),
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(5)),
"c": cty.NullVal(cty.ObjectWithOptionalAttrs(map[string]cty.Type{
"a": cty.String,
"b": cty.Bool,
}, []string{"b"})),
}),
}),
Type: cty.Set(cty.ObjectWithOptionalAttrs(map[string]cty.Type{
"c": cty.ObjectWithOptionalAttrs(map[string]cty.Type{
"a": cty.String,
"b": cty.Bool,
}, []string{"b"}),
"d": cty.Number,
}, []string{"c"})),
Want: cty.SetVal([]cty.Value{
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(10)),
"c": cty.ObjectVal(map[string]cty.Value{
"a": cty.StringVal("foo"),
"b": cty.BoolVal(true),
}),
}),
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(5)),
"c": cty.NullVal(cty.Object(map[string]cty.Type{
"a": cty.String,
"b": cty.Bool,
})),
}),
}),
},
{
Value: cty.TupleVal([]cty.Value{
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(10)),
"c": cty.ObjectVal(map[string]cty.Value{
"a": cty.StringVal("foo"),
"b": cty.BoolVal(true),
}),
}),
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(5)),
}),
}),
Type: cty.Set(cty.ObjectWithOptionalAttrs(map[string]cty.Type{
"c": cty.ObjectWithOptionalAttrs(map[string]cty.Type{
"a": cty.String,
"b": cty.Bool,
}, []string{"b"}),
"d": cty.Number,
}, []string{"c"})),
Want: cty.SetVal([]cty.Value{
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(10)),
"c": cty.ObjectVal(map[string]cty.Value{
"a": cty.StringVal("foo"),
"b": cty.BoolVal(true),
}),
}),
cty.ObjectVal(map[string]cty.Value{
"d": cty.NumberVal(big.NewFloat(5)),
"c": cty.NullVal(cty.Object(map[string]cty.Type{
"a": cty.String,
"b": cty.Bool,
})),
}),
}),
},
{
Value: cty.MapVal(map[string]cty.Value{
"a": cty.StringVal("boop"),
}),
Type: cty.ObjectWithOptionalAttrs(map[string]cty.Type{
"a": cty.String,
"b": cty.String,
"c": cty.Object(map[string]cty.Type{
"d": cty.String,
}),
}, []string{"b", "c"}),
Want: cty.ObjectVal(map[string]cty.Value{
"a": cty.StringVal("boop"),
"b": cty.NullVal(cty.String),
"c": cty.NullVal(cty.Object(map[string]cty.Type{
"d": cty.String,
})),
}),
WantError: false,
},
{
Value: cty.ListVal([]cty.Value{
cty.ObjectVal(map[string]cty.Value{
Expand Down

0 comments on commit bd2fd6b

Please sign in to comment.