| import type { Requester } from "@http"; | |
| export const _ENDPOINTS = ["v2/search", "v2/docs/info", "v2/docs/code"]; | |
| export type EndpointVariants = (typeof _ENDPOINTS)[number]; | |
| export interface CommandRequest { | |
| method?: "GET" | "POST"; | |
| body?: unknown; | |
| query?: Record<string, string | number | boolean | undefined>; | |
| } | |
| export class Command<TResult> { | |
| public readonly request: CommandRequest; | |
| public readonly endpoint: EndpointVariants; | |
| constructor(request: CommandRequest, endpoint: EndpointVariants | string) { | |
| this.request = request; | |
| this.endpoint = endpoint; | |
| } | |
| /** | |
| * Execute the command using a client. | |
| */ | |
| public async exec(client: Requester): Promise<TResult> { | |
| const { result } = await client.request<TResult>({ | |
| method: this.request.method || "POST", | |
| path: [this.endpoint], | |
| query: this.request.query, | |
| body: this.request.body, | |
| }); | |
| if (result === undefined) { | |
| throw new TypeError("Request did not return a result"); | |
| } | |
| return result; | |
| } | |
| } | |