-
Notifications
You must be signed in to change notification settings - Fork 20
/
wrappers.go
204 lines (179 loc) · 6.27 KB
/
wrappers.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
package functions
import (
"github.com/nyaruka/goflow/excellent/types"
"github.com/nyaruka/goflow/utils"
)
// ArgCountCheck wraps an XFunction and checks the number of args
func ArgCountCheck(min int, max int, f XFunction) XFunction {
return func(env utils.Environment, args ...types.XValue) types.XValue {
if min == max {
if len(args) != min {
return types.NewXErrorf("need %d argument(s), got %d", min, len(args))
}
} else {
if len(args) < min || len(args) > max {
return types.NewXErrorf("need %d to %d argument(s), got %d", min, max, len(args))
}
}
return f(env, args...)
}
}
// NoArgFunction creates an XFunction from a no-arg function
func NoArgFunction(f func(utils.Environment) types.XValue) XFunction {
return ArgCountCheck(0, 0, func(env utils.Environment, args ...types.XValue) types.XValue {
return f(env)
})
}
// OneArgFunction creates an XFunction from a single-arg function
func OneArgFunction(f func(utils.Environment, types.XValue) types.XValue) XFunction {
return ArgCountCheck(1, 1, func(env utils.Environment, args ...types.XValue) types.XValue {
return f(env, args[0])
})
}
// TwoArgFunction creates an XFunction from a two-arg function
func TwoArgFunction(f func(utils.Environment, types.XValue, types.XValue) types.XValue) XFunction {
return ArgCountCheck(2, 2, func(env utils.Environment, args ...types.XValue) types.XValue {
return f(env, args[0], args[1])
})
}
// ThreeArgFunction creates an XFunction from a three-arg function
func ThreeArgFunction(f func(utils.Environment, types.XValue, types.XValue, types.XValue) types.XValue) XFunction {
return ArgCountCheck(3, 3, func(env utils.Environment, args ...types.XValue) types.XValue {
return f(env, args[0], args[1], args[2])
})
}
// OneStringFunction creates an XFunction from a single string function
func OneStringFunction(f func(utils.Environment, types.XString) types.XValue) XFunction {
return ArgCountCheck(1, 1, func(env utils.Environment, args ...types.XValue) types.XValue {
str, xerr := types.ToXString(args[0])
if xerr != nil {
return xerr
}
return f(env, str)
})
}
// TwoStringFunction creates an XFunction from a function that takes two strings
func TwoStringFunction(f func(utils.Environment, types.XString, types.XString) types.XValue) XFunction {
return ArgCountCheck(2, 2, func(env utils.Environment, args ...types.XValue) types.XValue {
str1, xerr := types.ToXString(args[0])
if xerr != nil {
return xerr
}
str2, xerr := types.ToXString(args[1])
if xerr != nil {
return xerr
}
return f(env, str1, str2)
})
}
// ThreeStringFunction creates an XFunction from a function that takes three strings
func ThreeStringFunction(f func(utils.Environment, types.XString, types.XString, types.XString) types.XValue) XFunction {
return ArgCountCheck(3, 3, func(env utils.Environment, args ...types.XValue) types.XValue {
str1, xerr := types.ToXString(args[0])
if xerr != nil {
return xerr
}
str2, xerr := types.ToXString(args[1])
if xerr != nil {
return xerr
}
str3, xerr := types.ToXString(args[2])
if xerr != nil {
return xerr
}
return f(env, str1, str2, str3)
})
}
// StringAndNumberFunction creates an XFunction from a function that takes a string and a number
func StringAndNumberFunction(f func(utils.Environment, types.XString, types.XNumber) types.XValue) XFunction {
return ArgCountCheck(2, 2, func(env utils.Environment, args ...types.XValue) types.XValue {
str, xerr := types.ToXString(args[0])
if xerr != nil {
return xerr
}
num, xerr := types.ToXNumber(args[1])
if xerr != nil {
return xerr
}
return f(env, str, num)
})
}
// StringAndIntegerFunction creates an XFunction from a function that takes a string and an integer
func StringAndIntegerFunction(f func(utils.Environment, types.XString, int) types.XValue) XFunction {
return ArgCountCheck(2, 2, func(env utils.Environment, args ...types.XValue) types.XValue {
str, xerr := types.ToXString(args[0])
if xerr != nil {
return xerr
}
num, xerr := types.ToInteger(args[1])
if xerr != nil {
return xerr
}
return f(env, str, num)
})
}
// StringAndDateFunction creates an XFunction from a function that takes a string and a date
func StringAndDateFunction(f func(utils.Environment, types.XString, types.XDate) types.XValue) XFunction {
return ArgCountCheck(2, 2, func(env utils.Environment, args ...types.XValue) types.XValue {
str, xerr := types.ToXString(args[0])
if xerr != nil {
return xerr
}
date, xerr := types.ToXDate(env, args[1])
if xerr != nil {
return xerr
}
return f(env, str, date)
})
}
// OneNumberFunction creates an XFunction from a single number function
func OneNumberFunction(f func(utils.Environment, types.XNumber) types.XValue) XFunction {
return ArgCountCheck(1, 1, func(env utils.Environment, args ...types.XValue) types.XValue {
num, xerr := types.ToXNumber(args[0])
if xerr != nil {
return xerr
}
return f(env, num)
})
}
// OneNumberAndOptionalIntegerFunction creates an XFunction from a function that takes a number and an optional integer
func OneNumberAndOptionalIntegerFunction(f func(utils.Environment, types.XNumber, int) types.XValue, defaultVal int) XFunction {
return ArgCountCheck(1, 2, func(env utils.Environment, args ...types.XValue) types.XValue {
num, xerr := types.ToXNumber(args[0])
if xerr != nil {
return xerr
}
intVal := defaultVal
if len(args) == 2 {
intVal, xerr = types.ToInteger(args[1])
if xerr != nil {
return xerr
}
}
return f(env, num, intVal)
})
}
// TwoNumberFunction creates an XFunction from a function that takes two numbers
func TwoNumberFunction(f func(utils.Environment, types.XNumber, types.XNumber) types.XValue) XFunction {
return ArgCountCheck(2, 2, func(env utils.Environment, args ...types.XValue) types.XValue {
num1, xerr := types.ToXNumber(args[0])
if xerr != nil {
return xerr
}
num2, xerr := types.ToXNumber(args[1])
if xerr != nil {
return xerr
}
return f(env, num1, num2)
})
}
// OneDateFunction creates an XFunction from a single number function
func OneDateFunction(f func(utils.Environment, types.XDate) types.XValue) XFunction {
return ArgCountCheck(1, 1, func(env utils.Environment, args ...types.XValue) types.XValue {
date, xerr := types.ToXDate(env, args[0])
if xerr != nil {
return xerr
}
return f(env, date)
})
}