import { assert } from "node:console"; export interface IResponse { success: boolean; data: T; code: number; } export class BaseResponseBuilder { protected success: IResponse["success"] = undefined!; protected data: IResponse["data"] = undefined!; protected code: IResponse["code"] = undefined!; public constructor(data?: Partial>) { if (!data) { return; } if ("success" in data) { this.success = data.success as IResponse["success"]; } if ("data" in data) { this.data = data.data as IResponse["data"]; } if ("code" in data) { this.code = data.code as IResponse["code"]; } } public setData(data: T) { this.data = data; return this; } public setCode(code: number) { this.code = code; return this; } public toJSON() { const { success, data, code } = this; assert(typeof (success) === "boolean", "expected success to be boolean"); assert(typeof (code) === "number", "expected success to be number"); return { success, data, code, }; } } export class SuccessResponseBuilder extends BaseResponseBuilder { public constructor(options?: IResponse) { super(options); this.success = true; } } export class ErrorResponseBuilder extends BaseResponseBuilder { public constructor(options?: IResponse) { super(options); this.success = false; } }