working on validator
This commit is contained in:
@ -1,9 +1,9 @@
|
|||||||
import { Middleware } from "@lib/router.ts";
|
import { Middleware } from "@lib/router.ts";
|
||||||
|
|
||||||
const loggerMiddleware: Middleware = async (c, next) => {
|
const loggerMiddleware: Middleware = async (c, next) => {
|
||||||
console.log(c.req.method, c.path);
|
console.log("", c.req.method, c.path);
|
||||||
await next();
|
await next();
|
||||||
console.log(c.res.status);
|
console.log("", c.res.status, "\n");
|
||||||
};
|
};
|
||||||
|
|
||||||
export default loggerMiddleware;
|
export default loggerMiddleware;
|
||||||
|
|||||||
@ -1,11 +1,18 @@
|
|||||||
interface LoginRequest {
|
import { Result } from "@shared/utils/result.ts";
|
||||||
password: string;
|
|
||||||
|
class ValidationError extends BaseError {
|
||||||
|
code = "ValidationError";
|
||||||
|
constructor(msg: string) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LoginResponse {
|
class ClientApi<Req, Res> {
|
||||||
err: "InvalidPassword" | "InvalidInput";
|
constructor(path: string, method: string) {}
|
||||||
|
validate(res: Response): ResultAsync<Res> {
|
||||||
|
const body = await res.json();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Api<Req, Res> {
|
class ServerApi<Req, Res> {
|
||||||
makeRequest();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
import { err, ok } from "@shared/utils/result.ts";
|
import { err, ok, Result } from "@shared/utils/result.ts";
|
||||||
|
|
||||||
|
type OptionJSON<T> = { tag: "some"; value: T } | { tag: "none" };
|
||||||
|
|
||||||
interface IOption<T> {
|
interface IOption<T> {
|
||||||
/**
|
/**
|
||||||
@ -64,7 +66,6 @@ interface IOption<T> {
|
|||||||
* ```
|
* ```
|
||||||
* @param {Function} The function `fn` that takes the value inside the `Option<T>` and returns a new `Option<U>`.
|
* @param {Function} The function `fn` that takes the value inside the `Option<T>` and returns a new `Option<U>`.
|
||||||
* @returns {Option<U>} A new `Option<U>` wrapping the result of the flatMap operation.
|
* @returns {Option<U>} A new `Option<U>` wrapping the result of the flatMap operation.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
flatMap<U>(fn: (value: T) => Option<U>): Option<U>;
|
flatMap<U>(fn: (value: T) => Option<U>): Option<U>;
|
||||||
|
|
||||||
@ -136,6 +137,8 @@ interface IOption<T> {
|
|||||||
toBoolean(): boolean;
|
toBoolean(): boolean;
|
||||||
|
|
||||||
okOrElse<E>(errFn: () => E): Result<T, E>;
|
okOrElse<E>(errFn: () => E): Result<T, E>;
|
||||||
|
|
||||||
|
toJSON(): OptionJSON<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -211,17 +214,14 @@ export class Some<T> implements IOption<T> {
|
|||||||
return some(this.value);
|
return some(this.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
toJSON() {
|
|
||||||
return {
|
|
||||||
//_tag: this._tag,
|
|
||||||
value: this.value,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
toString() {
|
toString() {
|
||||||
return `Some(${this.value})`;
|
return `Some(${this.value})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toJSON(): OptionJSON<T> {
|
||||||
|
return { tag: "some", value: this.value };
|
||||||
|
}
|
||||||
|
|
||||||
toNullable(): T | null {
|
toNullable(): T | null {
|
||||||
return this.value;
|
return this.value;
|
||||||
}
|
}
|
||||||
@ -307,16 +307,14 @@ export class None<T> implements IOption<T> {
|
|||||||
return none();
|
return none();
|
||||||
}
|
}
|
||||||
|
|
||||||
toJSON() {
|
|
||||||
return {
|
|
||||||
_tag: this._tag,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
toString() {
|
toString() {
|
||||||
return `None`;
|
return `None`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toJSON(): OptionJSON<T> {
|
||||||
|
return { tag: "none" };
|
||||||
|
}
|
||||||
|
|
||||||
toNullable(): T | null {
|
toNullable(): T | null {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
import { some } from "@shared/utils/option.ts";
|
import { none, some } from "@shared/utils/option.ts";
|
||||||
import { None, type Option, Some } from "@shared/utils/option.ts";
|
import { None, type Option, Some } from "@shared/utils/option.ts";
|
||||||
import { errAsync, okAsync, ResultAsync } from "@shared/utils/resultasync.ts";
|
import { errAsync, okAsync, ResultAsync } from "@shared/utils/resultasync.ts";
|
||||||
|
|
||||||
type ResultJSON<T, E> = { tag: "ok"; value: T } | { tag: "err"; error: E };
|
type ResultJSON<T, E> = { tag: "ok"; value: T } | { tag: "err"; error: E };
|
||||||
|
|
||||||
//#region Ok, Err and Result
|
//#region Ok, Err and Result
|
||||||
interface IResult<T, E> {
|
interface IResult<T, E> {
|
||||||
isOk(): this is Ok<T, E>;
|
isOk(): this is Ok<T, E>;
|
||||||
@ -14,6 +13,7 @@ interface IResult<T, E> {
|
|||||||
unwrap(): T;
|
unwrap(): T;
|
||||||
unwrapOr<U>(defaultValue: U): T | U;
|
unwrapOr<U>(defaultValue: U): T | U;
|
||||||
unwrapOrElse<U>(fn: () => U): T | U;
|
unwrapOrElse<U>(fn: () => U): T | U;
|
||||||
|
unwrapErr(): Option<E>;
|
||||||
match<A, B = A>(ok: (value: T) => A, err: (error: E) => B): A | B;
|
match<A, B = A>(ok: (value: T) => A, err: (error: E) => B): A | B;
|
||||||
map<U>(fn: (value: T) => U): Result<U, E>;
|
map<U>(fn: (value: T) => U): Result<U, E>;
|
||||||
mapAsync<U>(fn: (value: T) => Promise<U>): ResultAsync<U, E>;
|
mapAsync<U>(fn: (value: T) => Promise<U>): ResultAsync<U, E>;
|
||||||
@ -89,6 +89,10 @@ export class Ok<T, E> implements IResult<T, E> {
|
|||||||
return this.value;
|
return this.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unwrapErr(): Option<E> {
|
||||||
|
return none;
|
||||||
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
match<A, B = A>(ok: (value: T) => A, err: (error: E) => B): A | B {
|
match<A, B = A>(ok: (value: T) => A, err: (error: E) => B): A | B {
|
||||||
return ok(this.value);
|
return ok(this.value);
|
||||||
@ -219,6 +223,9 @@ export class Err<T, E> implements IResult<T, E> {
|
|||||||
unwrapOrElse<U>(fn: () => U): T | U {
|
unwrapOrElse<U>(fn: () => U): T | U {
|
||||||
return fn();
|
return fn();
|
||||||
}
|
}
|
||||||
|
unwrapErr(): Option<E> {
|
||||||
|
return some(this.error);
|
||||||
|
}
|
||||||
match<A, B = A>(ok: (value: T) => A, err: (error: E) => B): A | B {
|
match<A, B = A>(ok: (value: T) => A, err: (error: E) => B): A | B {
|
||||||
return err(this.error);
|
return err(this.error);
|
||||||
}
|
}
|
||||||
@ -369,6 +376,27 @@ export type FlattenResult<R> = R extends Result<infer T, infer E>
|
|||||||
: R
|
: R
|
||||||
: never;
|
: never;
|
||||||
|
|
||||||
|
type ExtractError<R extends Result<unknown, unknown>> = R extends
|
||||||
|
Result<unknown, infer E> ? E : never;
|
||||||
|
|
||||||
|
type CollectedErrors<R extends Result<unknown, unknown>[]> = ExtractError<
|
||||||
|
R[number]
|
||||||
|
>;
|
||||||
|
|
||||||
|
function collectErrors<R extends Result<any, any>[]>(
|
||||||
|
...results: R
|
||||||
|
): CollectedErrors<R>[] {
|
||||||
|
const errors: CollectedErrors<R>[] = [];
|
||||||
|
|
||||||
|
for (const result of results) {
|
||||||
|
if (result.isErr()) {
|
||||||
|
errors.push(result.error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
class FailedToParseResult extends Error {
|
class FailedToParseResult extends Error {
|
||||||
constructor(json: string) {
|
constructor(json: string) {
|
||||||
super(`Failed to parse ${json} as result`);
|
super(`Failed to parse ${json} as result`);
|
||||||
|
|||||||
Reference in New Issue
Block a user