Skip to content

Commit 71fa773

Browse files
committed
Add parser error helper
1 parent 23e3c98 commit 71fa773

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
@@ -47,6 +47,13 @@ type ParserError<Message extends string> = { error: true } & Message
4747
type GenericStringError = ParserError<'Received a generic string'>
4848
export type SelectQueryError<Message extends string> = { error: true } & Message
4949

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+
5057
/**
5158
* Trims whitespace from the left of the input.
5259
*/
@@ -231,9 +238,10 @@ type ParseNode<Input extends string> = Input extends ''
231238
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer Fields, `${infer Remainder}`]
232239
? // `field!inner(nodes)`
233240
[{ 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+
>
237245
: EatWhitespace<Remainder> extends `!${infer Remainder}`
238246
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer Hint, `${infer Remainder}`]
239247
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
@@ -243,18 +251,20 @@ type ParseNode<Input extends string> = Input extends ''
243251
]
244252
? // `field!hint!inner(nodes)`
245253
[{ 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+
>
249258
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
250259
infer Fields,
251260
`${infer Remainder}`
252261
]
253262
? // `field!hint(nodes)`
254263
[{ 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+
>
258268
: ParserError<'Expected identifier after `!`'>
259269
: EatWhitespace<Remainder> extends `:${infer Remainder}`
260270
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer OriginalName, `${infer Remainder}`]
@@ -265,9 +275,10 @@ type ParseNode<Input extends string> = Input extends ''
265275
]
266276
? // `renamed_field:field!inner(nodes)`
267277
[{ 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+
>
271282
: EatWhitespace<Remainder> extends `!${infer Remainder}`
272283
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer Hint, `${infer Remainder}`]
273284
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
@@ -280,9 +291,10 @@ type ParseNode<Input extends string> = Input extends ''
280291
{ name: Name; original: OriginalName; hint: Hint; children: Fields },
281292
EatWhitespace<Remainder>
282293
]
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+
>
286298
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
287299
infer Fields,
288300
`${infer Remainder}`
@@ -297,9 +309,10 @@ type ParseNode<Input extends string> = Input extends ''
297309
},
298310
EatWhitespace<Remainder>
299311
]
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+
>
303316
: ParserError<'Expected identifier after `!`'>
304317
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
305318
infer Fields,

0 commit comments

Comments
 (0)