diff options
| author | Adam <[email protected]> | 2025-11-24 11:56:00 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-11-24 15:10:40 -0600 |
| commit | acf1dd85006a0bb4009ef601ae7f7a60eb36af4d (patch) | |
| tree | c8c7c0ed92e580016b968a64f066ea32bad17e2f /packages/util/src | |
| parent | 3fb57044d120618c92214b734d1fc831955e39a2 (diff) | |
| download | opencode-acf1dd85006a0bb4009ef601ae7f7a60eb36af4d.tar.gz opencode-acf1dd85006a0bb4009ef601ae7f7a60eb36af4d.zip | |
wip(share): more styling
Diffstat (limited to 'packages/util/src')
| -rw-r--r-- | packages/util/src/error.ts | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/packages/util/src/error.ts b/packages/util/src/error.ts new file mode 100644 index 000000000..12c27a0a7 --- /dev/null +++ b/packages/util/src/error.ts @@ -0,0 +1,54 @@ +import z from "zod" + +export abstract class NamedError extends Error { + abstract schema(): z.core.$ZodType + abstract toObject(): { name: string; data: any } + + static create<Name extends string, Data extends z.core.$ZodType>(name: Name, data: Data) { + const schema = z + .object({ + name: z.literal(name), + data, + }) + .meta({ + ref: name, + }) + const result = class extends NamedError { + public static readonly Schema = schema + + public override readonly name = name as Name + + constructor( + public readonly data: z.input<Data>, + options?: ErrorOptions, + ) { + super(name, options) + this.name = name + } + + static isInstance(input: any): input is InstanceType<typeof result> { + return typeof input === "object" && "name" in input && input.name === name + } + + schema() { + return schema + } + + toObject() { + return { + name: name, + data: this.data, + } + } + } + Object.defineProperty(result, "name", { value: name }) + return result + } + + public static readonly Unknown = NamedError.create( + "UnknownError", + z.object({ + message: z.string(), + }), + ) +} |
