UNPKG

3.33 kBJavaScriptView Raw
1/**
2 * @copyright Copyright (c) 2019 Maxim Khorin <maksimovichu@gmail.com>
3 */
4'use strict';
5
6const Base = require('./Validator');
7
8module.exports = class CompareValidator extends Base {
9
10 constructor (config) {
11 super({
12 compareAttr: null,
13 compareValue: null,
14 type: 'string',
15 operator: '==',
16 ...config
17 });
18 }
19
20 getMessage (params) {
21 let message;
22 switch (this.operator) {
23 case '==': message = 'Value must be repeated exactly'; break;
24 case '===': message = 'Value must be repeated exactly'; break;
25 case '!=': message = 'Value must not be equal to "{compareValue}"'; break;
26 case '!==': message = 'Value must not be equal to "{compareValue}"'; break;
27 case '>': message = 'Value must be greater than "{compareValue}"';break;
28 case '>=': message = 'Value must be greater than or equal to "{compareValue}"'; break;
29 case '<': message = 'Value must be less than "{compareValue}"'; break;
30 case '<=': message = 'Value must be less than or equal to "{compareValue}"'; break;
31 default: message = `Unknown operator: ${this.operator}`;
32 }
33 return this.createMessage(this.message, message, params);
34 }
35
36 getInvalidValueMessage () {
37 return this.createMessage(this.invalidValue, 'Invalid value');
38 }
39
40 validateAttr (attr, model) {
41 const value = model.get(attr);
42 let compareAttr, compareValue;
43 if (Array.isArray(value)) {
44 this.addError(model, attr, this.getInvalidValueMessage());
45 } else if (this.compareValue !== null) {
46 compareAttr = compareValue = this.compareValue;
47 } else {
48 compareValue = model.get(this.compareAttr);
49 compareAttr = model.getAttrLabel(this.compareAttr);
50 }
51 if (!this.compareValues(this.operator, this.type, value, compareValue)) {
52 this.addError(model, attr, this.getMessage({compareAttr, compareValue}));
53 }
54 }
55
56 validateValue (value) {
57 if (this.compareValue === null) {
58 throw new Error('Value must be set');
59 }
60 if (this.compareValues(this.operator, this.type, value, this.compareValue)) {
61 return this.getMessage({
62 compareAttr: this.compareAttr,
63 compareValue: this.compareValue
64 });
65 }
66 }
67
68 compareValues (operator, type, value, compareValue) {
69 if (type === 'number') {
70 value = Number(value);
71 compareValue = Number(compareValue);
72 } else {
73 value = String(value);
74 compareValue = String(compareValue);
75 }
76 switch (operator) {
77 case '==': return value == compareValue;
78 case '===': return value === compareValue;
79 case '!=': return value != compareValue;
80 case '!==': return value !== compareValue;
81 case '>': return value > compareValue;
82 case '>=': return value >= compareValue;
83 case '<': return value < compareValue;
84 case '<=': return value <= compareValue;
85 }
86 return false;
87 }
88};
\No newline at end of file