in base_config.go [285:338]
func (c *BaseConfig) expandBlock(b Block) ([]Block, error) {
var expandedBlocks []Block
hclBlock := b.HclBlock()
attr, ok := hclBlock.Body.Attributes["for_each"]
if !ok || b.getForEach() != nil {
return nil, nil
}
forEachValue, diag := attr.Expr.Value(c.EvalContext())
if diag.HasErrors() {
return nil, diag
}
if !forEachValue.CanIterateElements() {
return nil, fmt.Errorf("invalid `for_each`, except set or map: %s", attr.Range().String())
}
address := b.Address()
upstreams, err := c.d.GetAncestors(address)
if err != nil {
return nil, err
}
downstreams, err := c.d.GetChildren(address)
if err != nil {
return nil, err
}
iterator := forEachValue.ElementIterator()
for iterator.Next() {
key, value := iterator.Element()
newBlock := NewHclBlock(hclBlock.Block, hclBlock.wb, NewForEach(key, value))
nb, err := wrapBlock(b.Config(), newBlock)
if err != nil {
return nil, err
}
nb.markExpanded()
expandedAddress := blockAddress(newBlock)
expandedBlocks = append(expandedBlocks, nb)
err = c.d.AddVertexByID(expandedAddress, nb)
if err != nil {
return nil, err
}
for upstreamAddress := range upstreams {
err := c.d.addEdge(upstreamAddress, expandedAddress)
if err != nil {
return nil, err
}
}
for downstreamAddress := range downstreams {
err := c.d.addEdge(expandedAddress, downstreamAddress)
if err != nil {
return nil, err
}
}
}
b.markExpanded()
return expandedBlocks, c.d.DeleteVertex(address)
}