6c4344623b
The main HCL package is more visible this way, and so it's easier than having to pick it out from dozens of other package directories.
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
package dynblock
|
|
|
|
import (
|
|
"github.com/hashicorp/hcl/v2"
|
|
"github.com/zclconf/go-cty/cty"
|
|
)
|
|
|
|
type exprWrap struct {
|
|
hcl.Expression
|
|
i *iteration
|
|
}
|
|
|
|
func (e exprWrap) Variables() []hcl.Traversal {
|
|
raw := e.Expression.Variables()
|
|
ret := make([]hcl.Traversal, 0, len(raw))
|
|
|
|
// Filter out traversals that refer to our iterator name or any
|
|
// iterator we've inherited; we're going to provide those in
|
|
// our Value wrapper, so the caller doesn't need to know about them.
|
|
for _, traversal := range raw {
|
|
rootName := traversal.RootName()
|
|
if rootName == e.i.IteratorName {
|
|
continue
|
|
}
|
|
if _, inherited := e.i.Inherited[rootName]; inherited {
|
|
continue
|
|
}
|
|
ret = append(ret, traversal)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (e exprWrap) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) {
|
|
extCtx := e.i.EvalContext(ctx)
|
|
return e.Expression.Value(extCtx)
|
|
}
|
|
|
|
// UnwrapExpression returns the expression being wrapped by this instance.
|
|
// This allows the original expression to be recovered by hcl.UnwrapExpression.
|
|
func (e exprWrap) UnwrapExpression() hcl.Expression {
|
|
return e.Expression
|
|
}
|