Skip to content

Commit

Permalink
feat(type): add validator for value type
Browse files Browse the repository at this point in the history
  • Loading branch information
TomokiMiyauci committed May 17, 2023
1 parent 9c5309a commit 262f1d5
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions validators/type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright 2023-latest Tomoki Miyauchi. All rights reserved. MIT license.
// This module is browser compatible.

import { Assert, Display } from "../types.ts";
import { AssertiveScalarValidator, format } from "../utils.ts";
import error from "./error.json" assert { type: "json" };

export type Type = keyof TypeMap;

export interface TypeMap {
bigint: bigint;
boolean: boolean;
// deno-lint-ignore ban-types
function: Function;
number: number;
// deno-lint-ignore ban-types
object: object | null;
string: string;
symbol: symbol;
undefined: undefined;
}

export class TypeValidator<T extends Type>
extends AssertiveScalarValidator<unknown, TypeMap[T]> {
declare [Assert.symbol]: TypeMap[T];
constructor(public of: T) {
super();
super.expect(message);
}

override is(input: unknown): input is TypeMap[T] {
// deno-lint-ignore valid-typeof
return typeof input === this.of;
}

toString(): string {
return `type of ${this.of}`;
}
}

export function message(this: Display, { input }: { input: unknown }): string {
return format(error.should_be, this, typeof input);
}

0 comments on commit 262f1d5

Please sign in to comment.