@@ -47,6 +47,13 @@ type ParserError<Message extends string> = { error: true } & Message
47
47
type GenericStringError = ParserError < 'Received a generic string' >
48
48
export type SelectQueryError < Message extends string > = { error : true } & Message
49
49
50
+ /**
51
+ * Creates a new {@link ParserError} if the given input is not already a parser error.
52
+ */
53
+ type CreateParserErrorIfRequired < Input , Message extends string > = Input extends ParserError < string >
54
+ ? Input
55
+ : ParserError < Message >
56
+
50
57
/**
51
58
* Trims whitespace from the left of the input.
52
59
*/
@@ -231,9 +238,10 @@ type ParseNode<Input extends string> = Input extends ''
231
238
? ParseEmbeddedResource < EatWhitespace < Remainder > > extends [ infer Fields , `${infer Remainder } `]
232
239
? // `field!inner(nodes)`
233
240
[ { name : Name ; original : Name ; children : Fields } , EatWhitespace < Remainder > ]
234
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
235
- ? ParseEmbeddedResource < EatWhitespace < Remainder > >
236
- : ParserError < 'Expected embedded resource after `!inner`' >
241
+ : CreateParserErrorIfRequired <
242
+ ParseEmbeddedResource < EatWhitespace < Remainder > > ,
243
+ 'Expected embedded resource after `!inner`'
244
+ >
237
245
: EatWhitespace < Remainder > extends `!${infer Remainder } `
238
246
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer Hint , `${infer Remainder } `]
239
247
? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
@@ -243,18 +251,20 @@ type ParseNode<Input extends string> = Input extends ''
243
251
]
244
252
? // `field!hint!inner(nodes)`
245
253
[ { name : Name ; original : Name ; hint : Hint ; children : Fields } , EatWhitespace < Remainder > ]
246
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
247
- ? ParseEmbeddedResource < EatWhitespace < Remainder > >
248
- : ParserError < 'Expected embedded resource after `!inner`' >
254
+ : CreateParserErrorIfRequired <
255
+ ParseEmbeddedResource < EatWhitespace < Remainder > > ,
256
+ 'Expected embedded resource after `!inner`'
257
+ >
249
258
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
250
259
infer Fields ,
251
260
`${infer Remainder } `
252
261
]
253
262
? // `field!hint(nodes)`
254
263
[ { name : Name ; original : Name ; hint : Hint ; children : Fields } , EatWhitespace < Remainder > ]
255
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
256
- ? ParseEmbeddedResource < EatWhitespace < Remainder > >
257
- : ParserError < 'Expected embedded resource after `!hint`' >
264
+ : CreateParserErrorIfRequired <
265
+ ParseEmbeddedResource < EatWhitespace < Remainder > > ,
266
+ 'Expected embedded resource after `!hint`'
267
+ >
258
268
: ParserError < 'Expected identifier after `!`' >
259
269
: EatWhitespace < Remainder > extends `:${infer Remainder } `
260
270
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer OriginalName , `${infer Remainder } `]
@@ -265,9 +275,10 @@ type ParseNode<Input extends string> = Input extends ''
265
275
]
266
276
? // `renamed_field:field!inner(nodes)`
267
277
[ { name : Name ; original : OriginalName ; children : Fields } , EatWhitespace < Remainder > ]
268
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
269
- ? ParseEmbeddedResource < EatWhitespace < Remainder > >
270
- : ParserError < 'Expected embedded resource after `!inner`' >
278
+ : CreateParserErrorIfRequired <
279
+ ParseEmbeddedResource < EatWhitespace < Remainder > > ,
280
+ 'Expected embedded resource after `!inner`'
281
+ >
271
282
: EatWhitespace < Remainder > extends `!${infer Remainder } `
272
283
? ParseIdentifier < EatWhitespace < Remainder > > extends [ infer Hint , `${infer Remainder } `]
273
284
? EatWhitespace < Remainder > extends `!inner${infer Remainder } `
@@ -280,9 +291,10 @@ type ParseNode<Input extends string> = Input extends ''
280
291
{ name : Name ; original : OriginalName ; hint : Hint ; children : Fields } ,
281
292
EatWhitespace < Remainder >
282
293
]
283
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
284
- ? ParseEmbeddedResource < EatWhitespace < Remainder > >
285
- : ParserError < 'Expected embedded resource after `!inner`' >
294
+ : CreateParserErrorIfRequired <
295
+ ParseEmbeddedResource < EatWhitespace < Remainder > > ,
296
+ 'Expected embedded resource after `!inner`'
297
+ >
286
298
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
287
299
infer Fields ,
288
300
`${infer Remainder } `
@@ -297,9 +309,10 @@ type ParseNode<Input extends string> = Input extends ''
297
309
} ,
298
310
EatWhitespace < Remainder >
299
311
]
300
- : ParseEmbeddedResource < EatWhitespace < Remainder > > extends ParserError < string >
301
- ? ParseEmbeddedResource < EatWhitespace < Remainder > >
302
- : ParserError < 'Expected embedded resource after `!hint`' >
312
+ : CreateParserErrorIfRequired <
313
+ ParseEmbeddedResource < EatWhitespace < Remainder > > ,
314
+ 'Expected embedded resource after `!hint`'
315
+ >
303
316
: ParserError < 'Expected identifier after `!`' >
304
317
: ParseEmbeddedResource < EatWhitespace < Remainder > > extends [
305
318
infer Fields ,
0 commit comments