Skip to content

Commit 8c1ab97

Browse files
committed
Add parser error helper
1 parent 1de25c8 commit 8c1ab97

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

src/select-query-parser.ts

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,13 @@ type ParserError<Message extends string> = { error: true } & Message
109109
type GenericStringError = ParserError<'Received a generic string'>
110110
export type SelectQueryError<Message extends string> = { error: true } & Message
111111

112+
/**
113+
* Creates a new {@link ParserError} if the given input is not already a parser error.
114+
*/
115+
type CreateParserErrorIfRequired<Input, Message extends string> = Input extends ParserError<string>
116+
? Input
117+
: ParserError<Message>
118+
112119
/**
113120
* Trims whitespace from the left of the input.
114121
*/
@@ -348,9 +355,10 @@ type ParseNode<Input extends string> = Input extends ''
348355
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer Fields, `${infer Remainder}`]
349356
? // `field!inner(nodes)`
350357
[{ name: Name; original: Name; children: Fields }, EatWhitespace<Remainder>]
351-
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
352-
? ParseEmbeddedResource<EatWhitespace<Remainder>>
353-
: ParserError<'Expected embedded resource after `!inner`'>
358+
: CreateParserErrorIfRequired<
359+
ParseEmbeddedResource<EatWhitespace<Remainder>>,
360+
'Expected embedded resource after `!inner`'
361+
>
354362
: EatWhitespace<Remainder> extends `!${infer Remainder}`
355363
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer Hint, `${infer Remainder}`]
356364
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
@@ -360,18 +368,20 @@ type ParseNode<Input extends string> = Input extends ''
360368
]
361369
? // `field!hint!inner(nodes)`
362370
[{ name: Name; original: Name; hint: Hint; children: Fields }, EatWhitespace<Remainder>]
363-
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
364-
? ParseEmbeddedResource<EatWhitespace<Remainder>>
365-
: ParserError<'Expected embedded resource after `!inner`'>
371+
: CreateParserErrorIfRequired<
372+
ParseEmbeddedResource<EatWhitespace<Remainder>>,
373+
'Expected embedded resource after `!inner`'
374+
>
366375
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
367376
infer Fields,
368377
`${infer Remainder}`
369378
]
370379
? // `field!hint(nodes)`
371380
[{ name: Name; original: Name; hint: Hint; children: Fields }, EatWhitespace<Remainder>]
372-
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
373-
? ParseEmbeddedResource<EatWhitespace<Remainder>>
374-
: ParserError<'Expected embedded resource after `!hint`'>
381+
: CreateParserErrorIfRequired<
382+
ParseEmbeddedResource<EatWhitespace<Remainder>>,
383+
'Expected embedded resource after `!hint`'
384+
>
375385
: ParserError<'Expected identifier after `!`'>
376386
: EatWhitespace<Remainder> extends `:${infer Remainder}`
377387
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer OriginalName, `${infer Remainder}`]
@@ -389,9 +399,10 @@ type ParseNode<Input extends string> = Input extends ''
389399
]
390400
? // `renamed_field:field!inner(nodes)`
391401
[{ name: Name; original: OriginalName; children: Fields }, EatWhitespace<Remainder>]
392-
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
393-
? ParseEmbeddedResource<EatWhitespace<Remainder>>
394-
: ParserError<'Expected embedded resource after `!inner`'>
402+
: CreateParserErrorIfRequired<
403+
ParseEmbeddedResource<EatWhitespace<Remainder>>,
404+
'Expected embedded resource after `!inner`'
405+
>
395406
: EatWhitespace<Remainder> extends `!${infer Remainder}`
396407
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer Hint, `${infer Remainder}`]
397408
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
@@ -404,9 +415,10 @@ type ParseNode<Input extends string> = Input extends ''
404415
{ name: Name; original: OriginalName; hint: Hint; children: Fields },
405416
EatWhitespace<Remainder>
406417
]
407-
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
408-
? ParseEmbeddedResource<EatWhitespace<Remainder>>
409-
: ParserError<'Expected embedded resource after `!inner`'>
418+
: CreateParserErrorIfRequired<
419+
ParseEmbeddedResource<EatWhitespace<Remainder>>,
420+
'Expected embedded resource after `!inner`'
421+
>
410422
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
411423
infer Fields,
412424
`${infer Remainder}`
@@ -421,9 +433,10 @@ type ParseNode<Input extends string> = Input extends ''
421433
},
422434
EatWhitespace<Remainder>
423435
]
424-
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
425-
? ParseEmbeddedResource<EatWhitespace<Remainder>>
426-
: ParserError<'Expected embedded resource after `!hint`'>
436+
: CreateParserErrorIfRequired<
437+
ParseEmbeddedResource<EatWhitespace<Remainder>>,
438+
'Expected embedded resource after `!hint`'
439+
>
427440
: ParserError<'Expected identifier after `!`'>
428441
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
429442
infer Fields,

0 commit comments

Comments
 (0)