allow empty dynamic blocks with ConfigModeAttr

If a dynamic block is evaluated zero times, the body content will
contain 0 blocks. Allow the probe for ConfigModeAttr to accept that no
blocks with a matching attribute should still be converted to a block if
they are called with dynamicExpand.
This commit is contained in:
James Bardin 2019-05-31 16:20:52 -05:00
parent 6e5c6cbdea
commit 0133dda311
2 changed files with 19 additions and 4 deletions

View File

@ -196,6 +196,20 @@ dynamic "foo" {
}), }),
}), }),
}, },
"dynamic block with empty iterator": {
src: `
dynamic "foo" {
for_each = []
content {
bar = foo.value
}
}
`,
schema: fooSchema,
want: cty.ObjectVal(map[string]cty.Value{
"foo": cty.NullVal(fooSchema.Attributes["foo"].Type),
}),
},
"both attribute and block syntax": { "both attribute and block syntax": {
src: ` src: `
foo = [] foo = []

View File

@ -55,10 +55,11 @@ func effectiveSchema(given *hcl.BodySchema, body hcl.Body, ambiguousNames map[st
}, },
} }
content, _, _ = body.PartialContent(&probeSchema) content, _, _ = body.PartialContent(&probeSchema)
if len(content.Blocks) > 0 { if len(content.Blocks) > 0 || dynamicExpanded {
// No attribute present and at least one block present, so // A dynamic block with an empty iterator returns nothing.
// we'll need to rewrite this one as a block for a successful // If there's no attribute and we have either a block or a
// result. // dynamic expansion, we need to rewrite this one as a
// block for a successful result.
appearsAsBlock[name] = struct{}{} appearsAsBlock[name] = struct{}{}
} }
} }