Skip to content

Commit 32c00db

Browse files
committed
support function parameters with schema
1 parent 809424b commit 32c00db

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

lib/evaluation.js

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module.exports = Evaluation;
55

66
function Evaluation(js, script, data, refPrefix) {
77
this.js = js;
8+
this.ajv = js.ajv;
89
this.script = script;
910
this.data = data;
1011
this.refPrefix = refPrefix;

lib/instruction_keywords.js

+32-15
Original file line numberDiff line numberDiff line change
@@ -144,36 +144,53 @@ function eval$delay(params) {
144144
* @return {Function} Function that returns Script or synchronous/asynchronous value
145145
*/
146146
function eval$func(params) {
147-
var funcBody = params.$func;
148-
if (typeof funcBody == 'string') {
149-
if (Object.keys(params).length > 1)
150-
throw new Error('reference to function "' + funcBody + '" has other properties');
151-
if (!(funcBody in this.functions))
152-
throw new Error('unknown function "' + funcBody + '"');
153-
return this.functions[funcBody];
154-
}
155-
156147
var self = this;
157-
var valid = this.js.validate(funcBody);
148+
if (typeof params.$func == 'string')
149+
return funcByName(params.$func);
150+
151+
var valid = this.js.validate(params.$func);
152+
var argNames, argValidate;
158153
if (valid) {
159154
var pFunc = Promise.resolve(func);
160155
if (params.$name) this.functions[params.$name] = pFunc;
156+
if (params.$args) {
157+
argValidate = {};
158+
argNames = params.$args.map(function (arg) {
159+
if (typeof arg == 'string') return arg;
160+
var name = Object.keys(arg)[0];
161+
argValidate[name] = self.ajv.compile(arg[name]);
162+
return name;
163+
});
164+
}
161165
return pFunc;
162166
}
163-
throw new this.js.ajv.ValidationError(this.js.validate.errors);
167+
throw new this.ajv.ValidationError(this.js.validate.errors);
164168

165169
function func() {
166-
var data = params.$args ? prepareArguments(arguments) : self.data;
167-
var script = JSON.parse(JSON.stringify(funcBody));
170+
var data = argNames ? prepareArguments(arguments) : self.data;
171+
var script = JSON.parse(JSON.stringify(params.$func));
168172
return self.js.evaluate(script, data);
169173
}
170174

175+
function funcByName(name) {
176+
if (Object.keys(params).length > 1)
177+
throw new Error('reference to function "' + name + '" has other properties');
178+
if (!(name in self.functions))
179+
throw new Error('unknown function "' + name + '"');
180+
return self.functions[name];
181+
}
182+
171183
function prepareArguments(args) {
172184
var data = {};
173185
for (var i=0; i<args.length; i++) {
174186
data[i] = args[i];
175-
var argName = params.$args[i];
176-
if (argName) data[argName] = args[i];
187+
var argName = argNames[i];
188+
if (argName) {
189+
data[argName] = args[i];
190+
var validate = argValidate[argName];
191+
if (validate && !validate(args[i]))
192+
throw new self.ajv.ValidationError(validate.errors);
193+
}
177194
}
178195
return data;
179196
}

0 commit comments

Comments
 (0)