From cbb18d516db7f3cbd1046b8536da7c630ce1558d Mon Sep 17 00:00:00 2001 From: ton1c Date: Tue, 4 Feb 2025 15:03:39 +0300 Subject: [PATCH] working on api validator interface --- shared/utils/api.ts | 33 ++++++++++++++++++++++----------- shared/utils/result.ts | 13 +++++++++++-- shared/utils/validator.ts | 4 ++-- test1.ts | 2 +- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/shared/utils/api.ts b/shared/utils/api.ts index e4a1069..26f3669 100644 --- a/shared/utils/api.ts +++ b/shared/utils/api.ts @@ -1,7 +1,14 @@ -import { Result } from "@shared/utils/result.ts"; -import { Schema } from "@shared/utils/validator.ts"; +import { type Result } from "@shared/utils/result.ts"; +import { type InferSchema, Schema } from "@shared/utils/validator.ts"; -class ApiRoute< +export type ExtractRouteParams = T extends string + ? T extends `${infer _Start}:${infer Param}/${infer Rest}` + ? Param | ExtractRouteParams + : T extends `${infer _Start}:${infer Param}` ? Param + : never + : never; + +class ClientApi< Path extends string, ReqSchema extends Schema, ResSchema extends Schema, @@ -12,12 +19,16 @@ class ApiRoute< public readonly resSchema: ResSchema, ) { } -} -export type ExtractRouteParams = T extends string - ? T extends `${infer _Start}:${infer Param}/${infer Rest}` - ? Param | ExtractRouteParams - : T extends `${infer _Start}:${infer Param}` ? Param - : T extends `${infer _Start}*` ? "restOfThePath" - : never - : never; + makeRequest( + reqBody: InferSchemaType, + params?: ExtractRouteParams, + ) { + const pathWithParams = this.path.split("/").map((segment) => { + if (segment.startsWith(":")) { + return params[segment.slice(1)]; + } + return segment; + }); + } +} diff --git a/shared/utils/result.ts b/shared/utils/result.ts index 1b92f63..313ac50 100644 --- a/shared/utils/result.ts +++ b/shared/utils/result.ts @@ -20,7 +20,9 @@ interface IResult { mapErr(fn: (err: E) => U): Result; mapErrAsync(fn: (err: E) => Promise): ResultAsync; andThen(fn: (value: T) => Result): Result; - andThenAsync(fn: (value: T) => ResultAsync): ResultAsync; + andThenAsync( + fn: (value: T) => ResultAsync, + ): ResultAsync; flatten(): FlattenResult>; flattenOption(errFn: () => U): Result, U | E>; flattenOptionOr>( @@ -119,7 +121,9 @@ export class Ok implements IResult { return fn(this.value) as Result; } - andThenAsync(fn: (value: T) => ResultAsync): ResultAsync { + andThenAsync( + fn: (value: T) => ResultAsync, + ): ResultAsync { return fn(this.value); } @@ -254,6 +258,11 @@ export class Err implements IResult { andThen(fn: (value: T) => Result): Result { return new Err(this.error); } + andThenAsync( + fn: (value: T) => ResultAsync, + ): ResultAsync { + return new Err(this.error).toAsync(); + } flatten(): FlattenResult> { return flattenResult(this); } diff --git a/shared/utils/validator.ts b/shared/utils/validator.ts index f71d154..594f8ed 100644 --- a/shared/utils/validator.ts +++ b/shared/utils/validator.ts @@ -641,8 +641,6 @@ class NeverSchema extends BaseSchema { } } -type InferSchemaType = S extends Schema ? T : never; - class ObjectSchema>> extends BaseSchema<{ [K in keyof S]: InferSchemaType }> { private strictMode: boolean = false; @@ -1205,3 +1203,5 @@ export const z = { schema: T, ) => new OptionSchema(schema), }; + +export type InferSchemaType = S extends Schema ? T : never; diff --git a/test1.ts b/test1.ts index e9f9f75..dae100e 100644 --- a/test1.ts +++ b/test1.ts @@ -345,7 +345,7 @@ if (res.isErr()) { } // Utility Types -type InferSchema = S extends Schema ? T : never; +export type InferSchema = S extends Schema ? T : never; type InferSchemaUnion[]> = S[number] extends Schema ? U : never; type NestedArray = T | NestedArray[];