1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 'use strict';
-
- var util = require('./_util');
-
- module.exports = function defFunc(ajv) {
- if (!ajv._opts.$data) {
- console.warn('keyword select requires $data option');
- return ajv;
- }
- var metaSchemaRef = util.metaSchemaRef(ajv);
- var compiledCaseSchemas = [];
-
- defFunc.definition = {
- validate: function v(schema, data, parentSchema) {
- if (parentSchema.selectCases === undefined)
- throw new Error('keyword "selectCases" is absent');
- var compiled = getCompiledSchemas(parentSchema, false);
- var validate = compiled.cases[schema];
- if (validate === undefined) validate = compiled.default;
- if (typeof validate == 'boolean') return validate;
- var valid = validate(data);
- if (!valid) v.errors = validate.errors;
- return valid;
- },
- $data: true,
- metaSchema: { type: ['string', 'number', 'boolean', 'null'] }
- };
-
- ajv.addKeyword('select', defFunc.definition);
- ajv.addKeyword('selectCases', {
- compile: function (schemas, parentSchema) {
- var compiled = getCompiledSchemas(parentSchema);
- for (var value in schemas)
- compiled.cases[value] = compileOrBoolean(schemas[value]);
- return function() { return true; };
- },
- valid: true,
- metaSchema: {
- type: 'object',
- additionalProperties: metaSchemaRef
- }
- });
- ajv.addKeyword('selectDefault', {
- compile: function (schema, parentSchema) {
- var compiled = getCompiledSchemas(parentSchema);
- compiled.default = compileOrBoolean(schema);
- return function() { return true; };
- },
- valid: true,
- metaSchema: metaSchemaRef
- });
- return ajv;
-
-
- function getCompiledSchemas(parentSchema, create) {
- var compiled;
- compiledCaseSchemas.some(function (c) {
- if (c.parentSchema === parentSchema) {
- compiled = c;
- return true;
- }
- });
- if (!compiled && create !== false) {
- compiled = {
- parentSchema: parentSchema,
- cases: {},
- default: true
- };
- compiledCaseSchemas.push(compiled);
- }
- return compiled;
- }
-
- function compileOrBoolean(schema) {
- return typeof schema == 'boolean'
- ? schema
- : ajv.compile(schema);
- }
- };
|