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