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
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
14 func ExprMap(expr Expression) ([]KeyValuePair, Diagnostics) {
15 type exprMap interface {
16 ExprMap() []KeyValuePair
19 physExpr := UnwrapExpressionUntil(expr, func(expr Expression) bool {
20 _, supported := expr.(exprMap)
24 if exM, supported := physExpr.(exprMap); supported {
25 if pairs := exM.ExprMap(); pairs != nil {
29 return nil, Diagnostics{
32 Summary: "Invalid expression",
33 Detail: "A static map expression is required.",
34 Subject: expr.StartRange().Ptr(),
39 // KeyValuePair represents a pair of expressions that serve as a single item
40 // within a map or object definition construct.
41 type KeyValuePair struct {