12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- '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);
- }
- };
|