summaryrefslogtreecommitdiffhomepage
path: root/packages/util/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-11-24 11:56:00 -0600
committerAdam <[email protected]>2025-11-24 15:10:40 -0600
commitacf1dd85006a0bb4009ef601ae7f7a60eb36af4d (patch)
treec8c7c0ed92e580016b968a64f066ea32bad17e2f /packages/util/src
parent3fb57044d120618c92214b734d1fc831955e39a2 (diff)
downloadopencode-acf1dd85006a0bb4009ef601ae7f7a60eb36af4d.tar.gz
opencode-acf1dd85006a0bb4009ef601ae7f7a60eb36af4d.zip
wip(share): more styling
Diffstat (limited to 'packages/util/src')
-rw-r--r--packages/util/src/error.ts54
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(),
+ }),
+ )
+}