handle Null collections in flatmaps
When creating a flatmap from a cty.Value, there may be Null collections which don't need to be added to the flatmap at all. Skip over these to avoid panicking in ElementIterator with a Null value.
This commit is contained in:
parent
8f295fcb22
commit
05e85885f9
|
@ -68,6 +68,10 @@ func flatmapValueFromHCL2Primitive(m map[string]string, key string, val cty.Valu
|
||||||
}
|
}
|
||||||
|
|
||||||
func flatmapValueFromHCL2Map(m map[string]string, prefix string, val cty.Value) {
|
func flatmapValueFromHCL2Map(m map[string]string, prefix string, val cty.Value) {
|
||||||
|
if val.IsNull() {
|
||||||
|
// Omit entirely
|
||||||
|
return
|
||||||
|
}
|
||||||
if !val.IsKnown() {
|
if !val.IsKnown() {
|
||||||
switch {
|
switch {
|
||||||
case val.Type().IsObjectType():
|
case val.Type().IsObjectType():
|
||||||
|
@ -95,6 +99,10 @@ func flatmapValueFromHCL2Map(m map[string]string, prefix string, val cty.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func flatmapValueFromHCL2Seq(m map[string]string, prefix string, val cty.Value) {
|
func flatmapValueFromHCL2Seq(m map[string]string, prefix string, val cty.Value) {
|
||||||
|
if val.IsNull() {
|
||||||
|
// Omit entirely
|
||||||
|
return
|
||||||
|
}
|
||||||
if !val.IsKnown() {
|
if !val.IsKnown() {
|
||||||
m[prefix+"#"] = UnknownVariableValue
|
m[prefix+"#"] = UnknownVariableValue
|
||||||
return
|
return
|
||||||
|
|
|
@ -249,6 +249,73 @@ func TestFlatmapValueFromHCL2(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFlatmapValueFromHCL2FromFlatmap(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
Name string
|
||||||
|
Map map[string]string
|
||||||
|
Type cty.Type
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty flatmap with collections",
|
||||||
|
map[string]string{},
|
||||||
|
cty.Object(map[string]cty.Type{
|
||||||
|
"foo": cty.Map(cty.String),
|
||||||
|
"bar": cty.Set(cty.String),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nil flatmap with collections",
|
||||||
|
nil,
|
||||||
|
cty.Object(map[string]cty.Type{
|
||||||
|
"foo": cty.Map(cty.String),
|
||||||
|
"bar": cty.Set(cty.String),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"empty flatmap with nested collections",
|
||||||
|
map[string]string{},
|
||||||
|
cty.Object(map[string]cty.Type{
|
||||||
|
"foo": cty.Object(
|
||||||
|
map[string]cty.Type{
|
||||||
|
"baz": cty.Map(cty.String),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
"bar": cty.Set(cty.String),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"partial flatmap with nested collections",
|
||||||
|
map[string]string{
|
||||||
|
"foo.baz.%": "1",
|
||||||
|
"foo.baz.key": "val",
|
||||||
|
},
|
||||||
|
cty.Object(map[string]cty.Type{
|
||||||
|
"foo": cty.Object(
|
||||||
|
map[string]cty.Type{
|
||||||
|
"baz": cty.Map(cty.String),
|
||||||
|
"biz": cty.Map(cty.String),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
"bar": cty.Set(cty.String),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.Name, func(t *testing.T) {
|
||||||
|
val, err := HCL2ValueFromFlatmap(test.Map, test.Type)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
got := FlatmapValueFromHCL2(val)
|
||||||
|
|
||||||
|
for _, problem := range deep.Equal(got, test.Map) {
|
||||||
|
t.Error(problem)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
func TestHCL2ValueFromFlatmap(t *testing.T) {
|
func TestHCL2ValueFromFlatmap(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
Flatmap map[string]string
|
Flatmap map[string]string
|
||||||
|
|
Loading…
Reference in New Issue