func()

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)
}