blob: 84925d1834dfddd81d6e6742cbe4ba9a3c6ac474 [file] [log] [blame] [edit]
// 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
}