48 lines
1.6 KiB
Go
48 lines
1.6 KiB
Go
// Package dynblock provides an extension to HCL that allows dynamic
|
|
// declaration of nested blocks in certain contexts via a special block type
|
|
// named "dynamic".
|
|
package dynblock
|
|
|
|
import (
|
|
"github.com/hashicorp/hcl/v2"
|
|
)
|
|
|
|
// Expand "dynamic" blocks in the given body, returning a new body that
|
|
// has those blocks expanded.
|
|
//
|
|
// The given EvalContext is used when evaluating "for_each" and "labels"
|
|
// attributes within dynamic blocks, allowing those expressions access to
|
|
// variables and functions beyond the iterator variable created by the
|
|
// iteration.
|
|
//
|
|
// Expand returns no diagnostics because no blocks are actually expanded
|
|
// until a call to Content or PartialContent on the returned body, which
|
|
// will then expand only the blocks selected by the schema.
|
|
//
|
|
// "dynamic" blocks are also expanded automatically within nested blocks
|
|
// in the given body, including within other dynamic blocks, thus allowing
|
|
// multi-dimensional iteration. However, it is not possible to
|
|
// dynamically-generate the "dynamic" blocks themselves except through nesting.
|
|
//
|
|
// parent {
|
|
// dynamic "child" {
|
|
// for_each = child_objs
|
|
// content {
|
|
// dynamic "grandchild" {
|
|
// for_each = child.value.children
|
|
// labels = [grandchild.key]
|
|
// content {
|
|
// parent_key = child.key
|
|
// value = grandchild.value
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
func Expand(body hcl.Body, ctx *hcl.EvalContext) hcl.Body {
|
|
return &expandBody{
|
|
original: body,
|
|
forEachCtx: ctx,
|
|
}
|
|
}
|