-
Notifications
You must be signed in to change notification settings - Fork 1
/
ControlWrapper.js
43 lines (33 loc) · 1.61 KB
/
ControlWrapper.js
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
var _ = require('lodash');
var skmatc = require('../skmatc.js'),
Validator = skmatc.Validator,
Result = skmatc.Result;
module.exports = skmatc.create(function(schema) {
return _.isObject(schema) && Object.keys(schema).every(function(property) {
return property[0] === '$';
}, this) && Object.keys(schema).length;
}, function(schema, data, path) {
var message = schema.$message;
if(schema.$required === false && data === null) return [];
if(schema.$required === false && data === undefined) return [];
if(data === null || data === undefined) return this.fail(message || "Value of " + (path || 'value') + " must be defined and non-null");
if(schema.$type) {
var result = skmatc.validate(this.skmatc.validators, schema.$type, data, path);
if(message) result.failures.forEach(function(value) {
value.message = message;
});
return result.failures;
}
if(schema.$propertyType) {
if(!_.isPlainObject(data)) return this.fail(message || 'Expected ' + (path || 'value') + ' to be an object but got ' + JSON.stringify(data) + ' instead');
var result = Result.compound(_.map(data, (function(value, key) {
var newPath = (path ? path + '.' : '') + key;
return skmatc.validate(this.skmatc.validators, schema.$propertyType, value, newPath);
}).bind(this)));
if(message) result.failures.map(function(value) {
value.message = message;
});
return result.failures;
}
return this.fail("Expected either a $type or $propertyType command code, found neither.");
});