import { ZodError } from "dbtype"; export interface ErrorFormat { code: number; message: string; detail?: string; } export class ClientRequestError extends Error { code: number; constructor(code: number, message: string) { super(message); this.name = "client request error"; this.code = code; } } const code_to_message_table: { [key: number]: string | undefined } = { 400: "BadRequest", 404: "NotFound", }; export const error_handler = ({ code, error, set }: { code: string, error: Error, set: { status?: number | string } }) => { if (error instanceof ClientRequestError) { set.status = error.code; return { code: error.code, message: code_to_message_table[error.code] ?? "", detail: error.message, } satisfies ErrorFormat; } if (error instanceof ZodError) { set.status = 400; return { code: 400, message: "BadRequest", detail: error.errors.map((x) => x.message).join(", "), } satisfies ErrorFormat; } set.status = 500; return { code: 500, message: "Internal Server Error", detail: error.message, } }; export const sendError = (code: number, message?: string): never => { throw new ClientRequestError(code, message ?? ""); };