github.com/hashicorp/hcl/v2@v2.20.0/expr_call.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package hcl
     5  
     6  // ExprCall tests if the given expression is a function call and,
     7  // if so, extracts the function name and the expressions that represent
     8  // the arguments. If the given expression is not statically a function call,
     9  // error diagnostics are returned.
    10  //
    11  // A particular Expression implementation can support this function by
    12  // offering a method called ExprCall that takes no arguments and returns
    13  // *StaticCall. This method should return nil if a static call 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 ExprCall(expr Expression) (*StaticCall, Diagnostics) {
    18  	type exprCall interface {
    19  		ExprCall() *StaticCall
    20  	}
    21  
    22  	physExpr := UnwrapExpressionUntil(expr, func(expr Expression) bool {
    23  		_, supported := expr.(exprCall)
    24  		return supported
    25  	})
    26  
    27  	if exC, supported := physExpr.(exprCall); supported {
    28  		if call := exC.ExprCall(); call != nil {
    29  			return call, nil
    30  		}
    31  	}
    32  	return nil, Diagnostics{
    33  		&Diagnostic{
    34  			Severity: DiagError,
    35  			Summary:  "Invalid expression",
    36  			Detail:   "A static function call is required.",
    37  			Subject:  expr.StartRange().Ptr(),
    38  		},
    39  	}
    40  }
    41  
    42  // StaticCall represents a function call that was extracted statically from
    43  // an expression using ExprCall.
    44  type StaticCall struct {
    45  	Name      string
    46  	NameRange Range
    47  	Arguments []Expression
    48  	ArgsRange Range
    49  }