summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-03-02 17:07:34 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-03-02 17:07:34 +0900
commit7f4db37ff43e4a6efb4241cf84e328bbd3369b1b (patch)
tree405624107d2f53776e156d9bc3ea1948b666d477 /src
parent:v: (diff)
downloadsharkey-7f4db37ff43e4a6efb4241cf84e328bbd3369b1b.tar.gz
sharkey-7f4db37ff43e4a6efb4241cf84e328bbd3369b1b.tar.bz2
sharkey-7f4db37ff43e4a6efb4241cf84e328bbd3369b1b.zip
wip
Diffstat (limited to 'src')
-rw-r--r--src/api/validator2.ts99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/api/validator2.ts b/src/api/validator2.ts
new file mode 100644
index 0000000000..057875f80b
--- /dev/null
+++ b/src/api/validator2.ts
@@ -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();