pimatic
Version:
A home automation server and framework for the Raspberry PI running on node.js
68 lines (57 loc) • 2.41 kB
JavaScript
// ******************************************************************
// § 5.3. Validation keywords for arrays
// ******************************************************************
var testRunner = require('../index.js')
;
module.exports = function(config) {
var errors = [];
var index, subTestConfig;
if (Array.isArray(config.schema.items)) {
// array of schemas for each item in the array
var count = Math.min(config.inst.length, config.schema.items.length);
for (index = 0; index < count; ++index) {
var item = config.inst[index];
var itemSchema = config.schema.items[index];
subTestConfig = config.clone();
subTestConfig.inst = item;
subTestConfig.schema = itemSchema;
subTestConfig.resolutionScope =
config.resolutionScope + '/items/' + index;
subTestConfig.instanceContext = config.instanceContext + '/' + index;
errors = errors.concat(testRunner(subTestConfig));
}
// validate additional items in the array
if (config.inst.length > config.schema.items.length &&
Object.prototype.hasOwnProperty.call(config.schema, 'additionalItems'))
{
// If additionalItems is boolean, validation for the
// additionalItems keyword (above) is all we need. Otherwise,
// validate each remaining item.
if (typeof config.schema.additionalItems !== 'boolean') {
for (index = config.schema.items.length;
index < config.inst.length;
++index)
{
subTestConfig = config.clone();
subTestConfig.inst = config.inst[index];
subTestConfig.schema = config.schema.additionalItems;
subTestConfig.resolutionScope =
config.resolutionScope + '/items/' + index;
subTestConfig.instanceContext = config.instanceContext + '/' + index;
errors = errors.concat(testRunner(subTestConfig));
}
}
}
} else {
// one schema for all items in the array
for (index = 0; index < config.inst.length; ++index) {
subTestConfig = config.clone();
subTestConfig.inst = config.inst[index];
subTestConfig.schema = config.schema.items;
subTestConfig.resolutionScope = config.resolutionScope + '/items';
subTestConfig.instanceContext = config.instanceContext + '/' + index;
errors = errors.concat(testRunner(subTestConfig));
}
}
return errors;
};