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