1- import z from "zod "
1+ import { Schema } from "effect "
22
33export abstract class NamedError extends Error {
4- abstract schema ( ) : z . core . $ZodType
5- abstract toObject ( ) : { name : string ; data : any }
4+ abstract schema ( ) : Schema . Top
5+ abstract toObject ( ) : { name : string ; data : unknown }
66
77 static hasName ( error : unknown , name : string ) : boolean {
88 return (
99 typeof error === "object" && error !== null && "name" in error && ( error as Record < string , unknown > ) . name === name
1010 )
1111 }
1212
13- static create < Name extends string , Data extends z . core . $ZodType > ( name : Name , data : Data ) {
14- const schema = z
15- . object ( {
16- name : z . literal ( name ) ,
17- data,
18- } )
19- . meta ( {
20- ref : name ,
21- } )
13+ static create < Name extends string , Fields extends Schema . Struct . Fields > (
14+ name : Name ,
15+ fields : Fields ,
16+ ) : ReturnType < typeof NamedError . createSchemaClass < Name , Schema . Struct < Fields > > >
17+ static create < Name extends string , DataSchema extends Schema . Top > (
18+ name : Name ,
19+ data : DataSchema ,
20+ ) : ReturnType < typeof NamedError . createSchemaClass < Name , DataSchema > >
21+ static create < Name extends string > ( name : Name , data : Schema . Top | Schema . Struct . Fields ) {
22+ return NamedError . createSchemaClass ( name , Schema . isSchema ( data ) ? data : Schema . Struct ( data ) )
23+ }
24+
25+ private static createSchemaClass < Name extends string , DataSchema extends Schema . Top > ( name : Name , data : DataSchema ) {
26+ const schema = Schema . Struct ( {
27+ name : Schema . Literal ( name ) ,
28+ data,
29+ } ) . annotate ( { identifier : name } )
30+ type Data = Schema . Schema . Type < DataSchema >
31+
2232 const result = class extends NamedError {
2333 public static readonly Schema = schema
34+ public static readonly EffectSchema = schema
35+ public static readonly tag = name
2436
25- public override readonly name = name as Name
37+ public override readonly name = name
2638
2739 constructor (
28- public readonly data : z . input < Data > ,
40+ public readonly data : Data ,
2941 options ?: ErrorOptions ,
3042 ) {
3143 super ( name , options )
3244 this . name = name
3345 }
3446
35- static isInstance ( input : any ) : input is InstanceType < typeof result > {
36- return typeof input === "object" && " name" in input && input . name === name
47+ static isInstance ( input : unknown ) : input is InstanceType < typeof result > {
48+ return NamedError . hasName ( input , name )
3749 }
3850
3951 schema ( ) {
@@ -51,10 +63,7 @@ export abstract class NamedError extends Error {
5163 return result
5264 }
5365
54- public static readonly Unknown = NamedError . create (
55- "UnknownError" ,
56- z . object ( {
57- message : z . string ( ) ,
58- } ) ,
59- )
66+ public static readonly Unknown = NamedError . create ( "UnknownError" , {
67+ message : Schema . String ,
68+ } )
6069}
0 commit comments