// Copyright IBM Corp. 2014, 2026 // SPDX-License-Identifier: BUSL-1.1 package stackconfig import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/gohcl" "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/hashicorp/terraform/internal/tfdiags" ) // OutputValue is a declaration of a result from a stack configuration, which // can be read by the stack's caller. type OutputValue struct { Name string Type TypeConstraint Value hcl.Expression Description string Sensitive bool Ephemeral bool DeclRange tfdiags.SourceRange } func decodeOutputValueBlock(block *hcl.Block) (*OutputValue, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics ret := &OutputValue{ Name: block.Labels[0], DeclRange: tfdiags.SourceRangeFromHCL(block.DefRange), } if !hclsyntax.ValidIdentifier(ret.Name) { diags = diags.Append(invalidNameDiagnostic( "Invalid name for output value", block.LabelRanges[0], )) return nil, diags } content, hclDiags := block.Body.Content(outputValueBlockSchema) diags = diags.Append(hclDiags) if attr, ok := content.Attributes["type"]; ok { ret.Type.Expression = attr.Expr } if attr, ok := content.Attributes["value"]; ok { ret.Value = attr.Expr } if attr, ok := content.Attributes["description"]; ok { hclDiags := gohcl.DecodeExpression(attr.Expr, nil, &ret.Description) diags = diags.Append(hclDiags) } if attr, ok := content.Attributes["sensitive"]; ok { hclDiags := gohcl.DecodeExpression(attr.Expr, nil, &ret.Sensitive) diags = diags.Append(hclDiags) } if attr, ok := content.Attributes["ephemeral"]; ok { hclDiags := gohcl.DecodeExpression(attr.Expr, nil, &ret.Ephemeral) diags = diags.Append(hclDiags) } for _, block := range content.Blocks { diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Preconditions not yet supported", Detail: "Output values for a stack configuration do not yet support preconditions.", Subject: block.DefRange.Ptr(), }) } return ret, diags } var outputValueBlockSchema = &hcl.BodySchema{ Attributes: []hcl.AttributeSchema{ {Name: "type", Required: true}, {Name: "value", Required: false}, {Name: "description", Required: false}, {Name: "sensitive", Required: false}, {Name: "ephemeral", Required: false}, }, Blocks: []hcl.BlockHeaderSchema{ {Type: "precondition"}, }, }