github.com/hashicorp/hcl/v2@v2.20.0/expr_map.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package hcl 5 6 // ExprMap tests if the given expression is a static map construct and, 7 // if so, extracts the expressions that represent the map elements. 8 // If the given expression is not a static map, error diagnostics are 9 // returned. 10 // 11 // A particular Expression implementation can support this function by 12 // offering a method called ExprMap that takes no arguments and returns 13 // []KeyValuePair. This method should return nil if a static map cannot 14 // be extracted. Alternatively, an implementation can support 15 // UnwrapExpression to delegate handling of this function to a wrapped 16 // Expression object. 17 func ExprMap(expr Expression) ([]KeyValuePair, Diagnostics) { 18 type exprMap interface { 19 ExprMap() []KeyValuePair 20 } 21 22 physExpr := UnwrapExpressionUntil(expr, func(expr Expression) bool { 23 _, supported := expr.(exprMap) 24 return supported 25 }) 26 27 if exM, supported := physExpr.(exprMap); supported { 28 if pairs := exM.ExprMap(); pairs != nil { 29 return pairs, nil 30 } 31 } 32 return nil, Diagnostics{ 33 &Diagnostic{ 34 Severity: DiagError, 35 Summary: "Invalid expression", 36 Detail: "A static map expression is required.", 37 Subject: expr.StartRange().Ptr(), 38 }, 39 } 40 } 41 42 // KeyValuePair represents a pair of expressions that serve as a single item 43 // within a map or object definition construct. 44 type KeyValuePair struct { 45 Key Expression 46 Value Expression 47 }