From ccf34c5f307487e9bacea76945ff982535bc0988 Mon Sep 17 00:00:00 2001 From: Mahmood Ali Date: Fri, 16 Oct 2020 10:39:55 -0400 Subject: [PATCH] Support unknown variable evaluation Expose a callback to handle unknown variables found in hcl syntax. This is useful in situations where the variables aren't known statically upfront. --- eval_context.go | 4 ++++ traversal.go | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/eval_context.go b/eval_context.go index 915910ad..e0822b7b 100644 --- a/eval_context.go +++ b/eval_context.go @@ -11,6 +11,10 @@ type EvalContext struct { Variables map[string]cty.Value Functions map[string]function.Function parent *EvalContext + + // UnknownVariable handles when an unknown variable is referenced. + // This handler is experimental and may change in the future. + UnknownVariable func(Traversal) (cty.Value, error) } // NewChild returns a new EvalContext that is a child of the receiver. diff --git a/traversal.go b/traversal.go index d7101970..cd66be59 100644 --- a/traversal.go +++ b/traversal.go @@ -70,7 +70,12 @@ func (t Traversal) TraverseAbs(ctx *EvalContext) (cty.Value, Diagnostics) { thisCtx := ctx hasNonNil := false + var unknownHandler func(Traversal) (cty.Value, error) for thisCtx != nil { + if unknownHandler == nil && thisCtx.UnknownVariable != nil { + unknownHandler = thisCtx.UnknownVariable + } + if thisCtx.Variables == nil { thisCtx = thisCtx.parent continue @@ -83,6 +88,13 @@ func (t Traversal) TraverseAbs(ctx *EvalContext) (cty.Value, Diagnostics) { thisCtx = thisCtx.parent } + if unknownHandler != nil { + v, err := unknownHandler(t) + if err == nil { + return v, nil + } + } + if !hasNonNil { return cty.DynamicVal, Diagnostics{ {