You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

152 lines
3.2 KiB

// Load modules
var Any = require('./any');
var Cast = require('./cast');
var Ref = require('./ref');
// Declare internals
var internals = {
alternatives: require('./alternatives'),
array: require('./array'),
boolean: require('./boolean'),
binary: require('./binary'),
date: require('./date'),
number: require('./number'),
object: require('./object'),
string: require('./string')
};
internals.root = function () {
var any = new Any();
var root = any.clone();
root.any = function () {
return any;
};
root.alternatives = root.alt = function () {
return arguments.length ? internals.alternatives.try.apply(internals.alternatives, arguments) : internals.alternatives;
};
root.array = function () {
return internals.array;
};
root.boolean = root.bool = function () {
return internals.boolean;
};
root.binary = function () {
return internals.binary;
};
root.date = function () {
return internals.date;
};
root.func = function () {
return internals.object._func();
};
root.number = function () {
return internals.number;
};
root.object = function () {
return arguments.length ? internals.object.keys.apply(internals.object, arguments) : internals.object;
};
root.string = function () {
return internals.string;
};
root.ref = function () {
return Ref.create.apply(null, arguments);
};
root.isRef = function (ref) {
return Ref.isRef(ref);
};
root.validate = function (value /*, [schema], [options], callback */) {
var last = arguments[arguments.length - 1];
var callback = typeof last === 'function' ? last : null;
var count = arguments.length - (callback ? 1 : 0);
if (count === 1) {
return any.validate(value, callback);
}
var options = count === 3 ? arguments[2] : {};
var schema = root.compile(arguments[1]);
return schema._validateWithOptions(value, options, callback);
};
root.describe = function () {
var schema = arguments.length ? root.compile(arguments[0]) : any;
return schema.describe();
};
root.compile = function (schema) {
try {
return Cast.schema(schema);
}
catch (err) {
if (err.hasOwnProperty('path')) {
err.message += '(' + err.path + ')';
}
throw err;
}
};
root.assert = function (value, schema, message) {
root.attempt(value, schema, message);
};
root.attempt = function (value, schema, message) {
var result = root.validate(value, schema);
var error = result.error;
if (error) {
if (!message) {
error.message = error.annotate();
throw error;
}
if (!(message instanceof Error)) {
error.message = message + ' ' + error.annotate();
throw error;
}
throw message;
}
return result.value;
};
return root;
};
module.exports = internals.root();