1+ import type { StandardSchemaV1 } from '@standard-schema/spec'
12import type { ParseContext } from './ParseContext'
23
3- export type Success < T > = { success : true ; value : T }
4- export type Failure = { success : false ; error : ParseError }
4+ export type Success < T > = Extract <
5+ { readonly success : true ; readonly value : T } ,
6+ StandardSchemaV1 . SuccessResult < T >
7+ >
8+ export interface Failure extends ParseError {
9+ readonly success : false
10+ }
511
612/**
713 * @category Parsing
@@ -17,28 +23,44 @@ export type Failure = { success: false; error: ParseError }
1723 * | { success: false, error: ParseError }
1824 * ```
1925 */
20- export type ParseResult < T > = Success < T > | Failure
26+ export type ParseResult < T > = Extract <
27+ Success < T > | Failure ,
28+ StandardSchemaV1 . Result < T >
29+ >
2130
2231/**
2332 * @category Parsing
2433 * @see {@link ParseResult }
2534 * @see {@link ParseIssue }
2635 */
27- export type ParseError = {
28- schemaName : string
29- input : unknown
30- issues : ParseIssue [ ]
31- }
36+ export type ParseError = Extract <
37+ {
38+ readonly schemaName : string
39+ readonly input : unknown
40+ readonly issues : ReadonlyArray < StandardSchemaV1 . Issue >
41+ } ,
42+ StandardSchemaV1 . FailureResult
43+ >
3244
3345/**
3446 * @category Parsing
3547 * @see {@link ParseError }
3648 */
37- export type ParseIssue = {
38- schemaName : string
39- refinement ?: string
40- input : unknown
41- path : PropertyKey [ ]
49+ export type ParseIssue = Extract <
50+ {
51+ readonly schemaName : string
52+ readonly refinement ?: string
53+ readonly input : unknown
54+ readonly message : string
55+ readonly path : PropertyKey [ ]
56+ } ,
57+ StandardSchemaV1 . Issue
58+ >
59+
60+ function makeMessage ( issue : Omit < ParseIssue , 'message' > ) : string {
61+ const refinement = issue . refinement ? ` (${ issue . refinement } )` : ''
62+ const path = issue . path . length ? `At ${ issue . path . join ( '.' ) } : ` : ''
63+ return `${ path } not a ${ issue . schemaName } ${ refinement } `
4264}
4365
4466/**
@@ -64,14 +86,20 @@ export function failure(
6486 input : unknown ,
6587 refinement ?: string ,
6688) : Failure {
67- context . issues . push ( { input, schemaName, path : context . path , refinement } )
89+ context . issues . push ( {
90+ input,
91+ schemaName,
92+ path : context . path ,
93+ refinement,
94+ get message ( ) {
95+ return makeMessage ( this )
96+ } ,
97+ } )
6898 return {
6999 success : false ,
70- error : {
71- input : context . rootInput ,
72- schemaName : context . rootSchemaName ,
73- issues : context . issues ,
74- } ,
100+ input : context . rootInput ,
101+ schemaName : context . rootSchemaName ,
102+ issues : context . issues ,
75103 }
76104}
77105
@@ -97,10 +125,8 @@ export function success<T>(context: ParseContext, value: T): ParseResult<T> {
97125 ? { success : true , value }
98126 : {
99127 success : false ,
100- error : {
101- input : context . rootInput ,
102- schemaName : context . rootSchemaName ,
103- issues : context . issues ,
104- } ,
128+ input : context . rootInput ,
129+ schemaName : context . rootSchemaName ,
130+ issues : context . issues ,
105131 }
106132}
0 commit comments