Projekt

Obecné

Profil

Stáhnout (2.16 KB) Statistiky
| Větev: | Revize:
1
'use strict';
2

    
3
var util = require('./_util');
4

    
5
module.exports = function defFunc(ajv) {
6
  if (!ajv._opts.$data) {
7
    console.warn('keyword select requires $data option');
8
    return ajv;
9
  }
10
  var metaSchemaRef = util.metaSchemaRef(ajv);
11
  var compiledCaseSchemas = [];
12

    
13
  defFunc.definition = {
14
    validate: function v(schema, data, parentSchema) {
15
      if (parentSchema.selectCases === undefined)
16
        throw new Error('keyword "selectCases" is absent');
17
      var compiled = getCompiledSchemas(parentSchema, false);
18
      var validate = compiled.cases[schema];
19
      if (validate === undefined) validate = compiled.default;
20
      if (typeof validate == 'boolean') return validate;
21
      var valid = validate(data);
22
      if (!valid) v.errors = validate.errors;
23
      return valid;
24
    },
25
    $data: true,
26
    metaSchema: { type: ['string', 'number', 'boolean', 'null'] }
27
  };
28

    
29
  ajv.addKeyword('select', defFunc.definition);
30
  ajv.addKeyword('selectCases', {
31
    compile: function (schemas, parentSchema) {
32
      var compiled = getCompiledSchemas(parentSchema);
33
      for (var value in schemas)
34
        compiled.cases[value] = compileOrBoolean(schemas[value]);
35
      return function() { return true; };
36
    },
37
    valid: true,
38
    metaSchema: {
39
      type: 'object',
40
      additionalProperties: metaSchemaRef
41
    }
42
  });
43
  ajv.addKeyword('selectDefault', {
44
    compile: function (schema, parentSchema) {
45
      var compiled = getCompiledSchemas(parentSchema);
46
      compiled.default = compileOrBoolean(schema);
47
      return function() { return true; };
48
    },
49
    valid: true,
50
    metaSchema: metaSchemaRef
51
  });
52
  return ajv;
53

    
54

    
55
  function getCompiledSchemas(parentSchema, create) {
56
    var compiled;
57
    compiledCaseSchemas.some(function (c) {
58
      if (c.parentSchema === parentSchema) {
59
        compiled = c;
60
        return true;
61
      }
62
    });
63
    if (!compiled && create !== false) {
64
      compiled = {
65
        parentSchema: parentSchema,
66
        cases: {},
67
        default: true
68
      };
69
      compiledCaseSchemas.push(compiled);
70
    }
71
    return compiled;
72
  }
73

    
74
  function compileOrBoolean(schema) {
75
    return typeof schema == 'boolean'
76
            ? schema
77
            : ajv.compile(schema);
78
  }
79
};
(17-17/21)