forked from CloudyKit/jet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
func.go
69 lines (60 loc) · 2.28 KB
/
func.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Copyright 2016 José Santos <[email protected]>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package jet
import (
"fmt"
"reflect"
)
// Arguments holds the arguments passed to jet.Func.
type Arguments struct {
runtime *Runtime
argExpr []Expression
argVal []reflect.Value
}
// Get gets an argument by index.
func (a *Arguments) Get(argumentIndex int) reflect.Value {
if argumentIndex < len(a.argVal) {
return a.argVal[argumentIndex]
}
if argumentIndex < len(a.argVal)+len(a.argExpr) {
return a.runtime.evalPrimaryExpressionGroup(a.argExpr[argumentIndex-len(a.argVal)])
}
return reflect.Value{}
}
// Panicf panics with formatted error message.
func (a *Arguments) Panicf(format string, v ...interface{}) {
panic(fmt.Errorf(format, v...))
}
// RequireNumOfArguments panics if the number of arguments is not in the range specified by min and max.
// In case there is no minimum pass -1, in case there is no maximum pass -1 respectively.
func (a *Arguments) RequireNumOfArguments(funcname string, min, max int) {
num := len(a.argExpr) + len(a.argVal)
if min >= 0 && num < min {
a.Panicf("unexpected number of arguments in a call to %s", funcname)
} else if max >= 0 && num > max {
a.Panicf("unexpected number of arguments in a call to %s", funcname)
}
}
// NumOfArguments returns the number of arguments
func (a *Arguments) NumOfArguments() int {
return len(a.argExpr) + len(a.argVal)
}
// Runtime get the Runtime context
func (a *Arguments) Runtime() *Runtime {
return a.runtime
}
// Func function implementing this type is called directly, which is faster than calling through reflect.
// If a function is being called many times in the execution of a template, you may consider implementing
// a wrapper for that function implementing a Func.
type Func func(Arguments) reflect.Value