mirror of
https://github.com/kokonect-link/cherrypick
synced 2024-12-12 13:48:28 +09:00
wip
This commit is contained in:
parent
168039e682
commit
7f4db37ff4
99
src/api/validator2.ts
Normal file
99
src/api/validator2.ts
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
import * as mongo from 'mongodb';
|
||||||
|
import hasDuplicates from '../common/has-duplicates';
|
||||||
|
|
||||||
|
type CustomValidator<T> = (value: T) => boolean | string;
|
||||||
|
|
||||||
|
interface Validator {
|
||||||
|
get: () => [any, string];
|
||||||
|
|
||||||
|
required: () => Validator;
|
||||||
|
|
||||||
|
validate: (validator: CustomValidator<any>) => Validator;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ValidatorCore implements Validator {
|
||||||
|
value: any;
|
||||||
|
error: string;
|
||||||
|
|
||||||
|
required() {
|
||||||
|
if (this.error === null && this.value === null) {
|
||||||
|
this.error = 'required';
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
get(): [any, string] {
|
||||||
|
return [this.value, this.error];
|
||||||
|
}
|
||||||
|
|
||||||
|
validate(validator: any) {
|
||||||
|
if (this.error || this.value === null) return this;
|
||||||
|
const result = validator(this.value);
|
||||||
|
if (result === false) {
|
||||||
|
this.error = 'invalid-format';
|
||||||
|
} else if (typeof result == 'string') {
|
||||||
|
this.error = result;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NumberValidator extends ValidatorCore {
|
||||||
|
value: number;
|
||||||
|
error: string;
|
||||||
|
|
||||||
|
constructor(value) {
|
||||||
|
super();
|
||||||
|
if (value === undefined || value === null) {
|
||||||
|
this.value = null;
|
||||||
|
} else if (!Number.isFinite(value)) {
|
||||||
|
this.error = 'must-be-a-number';
|
||||||
|
} else {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
range(min: number, max: number) {
|
||||||
|
if (this.error || this.value === null) return this;
|
||||||
|
if (this.value < min || this.value > max) {
|
||||||
|
this.error = 'invalid-range';
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
required() {
|
||||||
|
return super.required();
|
||||||
|
}
|
||||||
|
|
||||||
|
get(): [number, string] {
|
||||||
|
return super.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
validate(validator: CustomValidator<number>) {
|
||||||
|
return super.validate(validator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const it = (value) => {
|
||||||
|
return {
|
||||||
|
must: {
|
||||||
|
be: {
|
||||||
|
a: {
|
||||||
|
string: 0,
|
||||||
|
number: () => new NumberValidator(value),
|
||||||
|
boolean: 0,
|
||||||
|
set: 0
|
||||||
|
},
|
||||||
|
an: {
|
||||||
|
id: 0,
|
||||||
|
array: 0,
|
||||||
|
object: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default it;
|
||||||
|
|
||||||
|
const [n, e] = it(42).must.be.a.number().required().range(10, 70).validate(x => x != 21).get();
|
Loading…
Reference in New Issue
Block a user