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