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 }