diff options
| author | Dax <[email protected]> | 2026-04-15 10:26:20 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-15 14:26:20 +0000 |
| commit | be9432a893dd1662c10ff41c7ab552bcba8f3e1b (patch) | |
| tree | f49000b3dd9c3bea5247d319e8fcbd4fb879b7b0 /packages/shared/src/util/error.ts | |
| parent | af20191d1cd60a7f4a421ad81eca5053f7deace1 (diff) | |
| download | opencode-be9432a893dd1662c10ff41c7ab552bcba8f3e1b.tar.gz opencode-be9432a893dd1662c10ff41c7ab552bcba8f3e1b.zip | |
shared package (#22626)
Diffstat (limited to 'packages/shared/src/util/error.ts')
| -rw-r--r-- | packages/shared/src/util/error.ts | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/packages/shared/src/util/error.ts b/packages/shared/src/util/error.ts new file mode 100644 index 000000000..12c27a0a7 --- /dev/null +++ b/packages/shared/src/util/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(), + }), + ) +} |
