1
1
import { Interpret } from "./interpreter" ;
2
- import { Tokenize , TokenTypes } from "./tokenizer" ;
2
+ import { Token , Tokenize , TokenTypes } from "./tokenizer" ;
3
3
import { Head , Head2 , ParseObj , TailBy } from "./utils" ;
4
4
5
5
export type ParserError < T extends string > = T & { __brand : "ParserError" } ;
@@ -22,14 +22,13 @@ type Eat<T extends { type: keyof TokenTypes }, Type extends string> = Expect<
22
22
: Expect < T , Type , true > ;
23
23
24
24
type IsToken <
25
- Tok extends { type : string } ,
25
+ Tok extends { type : keyof TokenTypes } ,
26
26
TokenType extends keyof TokenTypes
27
27
> = Tok [ "type" ] extends TokenType ? true : false ;
28
28
29
- type HasErrors <
30
- E extends ParserError < string > ,
31
- Else
32
- > = E extends ParserError < string > ? E : Else ;
29
+ type HasErrors < Value extends unknown , Else > = Value extends ParserError < string >
30
+ ? Value
31
+ : Else ;
33
32
34
33
type GetValueIfNoParserError < T , K > = [ Exclude < T , K > ] extends [ never ]
35
34
? T
@@ -44,8 +43,8 @@ type ParseIndexAccess<T extends any[]> = [
44
43
? GetValueIfNoParserError <
45
44
HasErrors <
46
45
P1 | P2 | Rest [ 0 ] ,
47
- P2 extends { type : "NUMBER" }
48
- ? { type : "ArrayAccess" ; index : P2 [ "value" ] ; eat : 3 }
46
+ P2 extends { type : "NUMBER" ; value : infer Index }
47
+ ? { type : "ArrayAccess" ; index : Index ; eat : 3 }
49
48
: { type : "ArrayAccess" ; index : never ; eat : 3 }
50
49
> ,
51
50
{ type : "ArrayAccess" }
@@ -61,21 +60,21 @@ type ParseWhereClause<T extends any[]> = [
61
60
? GetValueIfNoParserError <
62
61
HasErrors <
63
62
P1 | P2 | P3 | P4 ,
64
- { type : "WhereClause" ; value : ParseObj < P3 [ "name" ] > ; eat : 4 }
63
+ P3 extends { type : "IDENT" ; name : infer Name }
64
+ ? { type : "WhereClause" ; value : ParseObj < Name & string > ; eat : 4 }
65
+ : { type : "WhereClause" ; value : { } ; eat : 4 }
65
66
> ,
66
67
{ type : "WhereClause" }
67
68
>
68
69
: never ;
69
70
70
- type DD = ParseWhereClause < Tokenize < "$where(a:1)" > > ;
71
-
72
71
export type Parser <
73
- T extends any [ ] ,
72
+ T extends Token [ ] ,
74
73
AST = { } ,
75
- Cursor = Head < T > ,
76
- LookAhead = Head2 < T >
74
+ Cursor extends Token = Head < T > ,
75
+ LookAhead extends Token = Head2 < T >
77
76
> = IsToken < Cursor , "WHERE" > extends true
78
- ? Parser < TailBy < T , 4 > , AST & ParseWhereClause < T > >
77
+ ? Parser < TailBy < T , 4 > , ParseWhereClause < T > >
79
78
: IsToken < Cursor , "IDENT" > extends true
80
79
? Parser < TailBy < T , 1 > , AST & { type : "Identifier" ; value : Cursor [ "name" ] } >
81
80
: IsToken < Cursor , "DOT" > extends true
@@ -112,10 +111,16 @@ export type Parser<
112
111
// type D = ParseIndexAccess<Tokenize<"0]">>;
113
112
// type K = Interpret<{ a: { b: [0] } }, L3>;
114
113
115
- type Toks = Tokenize < "a[].$where(id:1,age:2)" > ;
114
+ // TODO Throw error on where syntax
115
+ type Toks = Tokenize < "b[].$where().i[].$where(id:i11)" > ;
116
116
type AST = Parser < Toks > ;
117
117
type K = Interpret <
118
- { a : [ { id : 1 ; age : 2 ; name : "one" } , { id : 2 ; age : 2 ; name : "two" } ] } ,
118
+ {
119
+ b : [
120
+ { id : 1 ; i : [ { id : "i11" } , { id : "i12" } ] } ,
121
+ { id : 2 ; i : [ { id : "i21" } , { id : "i22" } ] }
122
+ ] ;
123
+ } ,
119
124
AST
120
125
> ;
121
126
0 commit comments