opencode_offline/packages/opencode/src/util/error.ts

61 lines
1.2 KiB
TypeScript
Raw Normal View History

2025-06-10 02:01:11 +08:00
import { z, type ZodSchema } from "zod"
import { Log } from "./log"
const log = Log.create()
2025-06-10 02:01:11 +08:00
export abstract class NamedError extends Error {
abstract schema(): ZodSchema
abstract toObject(): { name: string; data: any }
static create<Name extends string, Data extends ZodSchema>(
name: Name,
data: Data,
) {
const schema = z
.object({
name: z.literal(name),
data,
})
.openapi({
ref: name,
})
2025-06-10 02:01:11 +08:00
const result = class extends NamedError {
public static readonly Schema = schema
2025-06-10 02:01:11 +08:00
public readonly name = name as Name
2025-06-10 02:01:11 +08:00
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 "name" in input && input.name === name
}
schema() {
return schema
2025-06-10 02:01:11 +08:00
}
toObject() {
return {
name: name,
data: this.data,
}
}
}
Object.defineProperty(result, "name", { value: name })
2025-06-10 02:01:11 +08:00
return result
}
public static readonly Unknown = NamedError.create(
"UnknownError",
z.object({
message: z.string(),
}),
)
}