import { type Result } from "@shared/utils/result.ts"; import { type InferSchema, Schema } from "@shared/utils/validator.ts"; 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, > { constructor( public readonly path: Path, public readonly reqSchema: ReqSchema, public readonly resSchema: ResSchema, ) { } makeRequest( reqBody: InferSchemaType, params?: ExtractRouteParams, ) { const pathWithParams = this.path.split("/").map((segment) => { if (segment.startsWith(":")) { return params[segment.slice(1)]; } return segment; }); } }