// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package stackruntime import ( "context" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackconfig" "github.com/hashicorp/terraform/internal/stacks/stackruntime/internal/stackeval" "github.com/hashicorp/terraform/internal/stacks/stackstate" "github.com/hashicorp/terraform/internal/tfdiags" "github.com/zclconf/go-cty/cty" ) // EvalExpr evaluates the given expression in a specified evaluation // environment and scope. // // This is intended for situations like the "terraform console" command which // need to evaluate arbitrary expressions against a configuration and // previously-established state snapshot. func EvalExpr(ctx context.Context, expr hcl.Expression, req *EvalExprRequest) (cty.Value, tfdiags.Diagnostics) { main := stackeval.NewForInspecting(req.Config, req.State, stackeval.InspectOpts{ InputVariableValues: req.InputValues, ProviderFactories: req.ProviderFactories, }) main.AllowLanguageExperiments(req.ExperimentsAllowed) return main.EvalExpr(ctx, expr, req.EvalStackInstance, stackeval.InspectPhase) } // EvalExprRequest represents the inputs to an [EvalExpr] call. type EvalExprRequest struct { // Config and State together provide the global environment in which // the expression will be evaluated. Config *stackconfig.Config State *stackstate.State // EvalStackInstance is the address of the stack instance where the // expression is to be evaluated. If unspecified, the default is // to evaluate in the root stack instance. EvalStackInstance stackaddrs.StackInstance // InputValues and ProviderFactories are both optional extras to // provide a more complete evaluation environment, although neither // needs to be provided if the expression to be evaluated doesn't // (directly or indirectly) make use of input variables or provider // configurations corresponding to these. InputValues map[stackaddrs.InputVariable]ExternalInputValue ProviderFactories map[addrs.Provider]providers.Factory ExperimentsAllowed bool }