mirror of
https://github.com/hashicorp/terraform.git
synced 2026-02-19 02:39:17 -05:00
56 lines
2.2 KiB
Go
56 lines
2.2 KiB
Go
// Copyright IBM Corp. 2014, 2026
|
|
// 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
|
|
}
|