Added logical or

This commit is contained in:
Sebastian Seedorf
2020-05-26 09:52:19 +02:00
parent c59e4a6a50
commit 05427eb47b
4 changed files with 49 additions and 3 deletions

View File

@@ -26,7 +26,7 @@ export type Schema = { [key: string]: Validatable } | {
export async function validate(
value: any,
validators: Validatable,
): Promise<ValidationError[] | undefined> {
): Promise<ValidationError[]> {
if (instanceofValidatorArray(validators) || instanceofValidator(validators)) {
return validateValue(value, validators);
} else {

5
mod.ts
View File

@@ -6,5 +6,6 @@ export {
Validatable,
ArraySymbol,
} from "./Validator.ts";
export * from "./validators/string.ts";
export * from "./validators/number.ts";
export { isString } from "./validators/string.ts";
export { isNumber, isInteger } from "./validators/number.ts";
export { or } from "./validators/logic.ts";

27
validators/logic.test.ts Normal file
View File

@@ -0,0 +1,27 @@
import { or } from "./logic.ts";
import { validate, Validator, isString, isInteger } from "../mod.ts";
import {
assertEquals,
assertNotEquals,
} from "https://deno.land/std@0.53.0/testing/asserts.ts";
Deno.test("or (match)", async () => {
const values: [any, Validator[]][] = [
["", [isString, isInteger]],
[1, [isString, isInteger]],
];
for (const [value, validators] of values) {
assertEquals(await validate(value, or(...validators)), []);
}
});
Deno.test("or (no match)", async () => {
const values: [any, Validator[]][] = [
[true, [isString, isInteger]],
[3.1415, [isString, isInteger]],
[1, [isString]],
];
for (const [value, validators] of values) {
assertNotEquals(await validate(value, or(...validators)), []);
}
});

18
validators/logic.ts Normal file
View File

@@ -0,0 +1,18 @@
import { Validator, Args, Validatable, validate } from "../mod.ts";
export function or(...funcs: Validatable[]): Validator {
return {
type: "or",
check: async (value: any) => {
const errors = await Promise.all(funcs.map((x) => validate(value, x)));
if (errors.every((x) => x.length > 0)) {
return {
errors,
};
}
},
message: (value: any, args?: Args) => {
return "At least one of the rules has to be successful.";
},
};
}