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  }