import type { ResolvedDankConfig } from './config.ts' import type { DankDevApiMethodKind, DankDevApiRequest, DankDevApiResponse, DankDevPage, } from './dev_api.ts' export class DankDevApi { #c: ResolvedDankConfig #handlers: DankDevApiHandlers = { 'dev-pages': fetchDevPages, } constructor(c: ResolvedDankConfig) { this.#c = c } async invokeReq< K extends DankDevApiMethodKind, REQ extends DankDevApiRequest, >(req: REQ): Promise> { return await this.#handlers[req.kind](this.#c, req) } } type DankDevApiHandlers = { [K in DankDevApiMethodKind]: DankDevApiHandler } type DankDevApiHandler = ( c: ResolvedDankConfig, req: DankDevApiRequest, ) => Promise> async function fetchDevPages( c: ResolvedDankConfig, _: DankDevApiRequest<'dev-pages'>, ): Promise> { const pages: Array = Object.entries(c.devPages).map( ([url, mapping]) => { return { url: url as `/${string}`, label: mapping.label || mapping.webpage, } }, ) return { kind: 'dev-pages', pages } }