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