1
1
mod cursor;
2
+ mod lookup;
2
3
mod token;
3
4
mod token_kind;
4
5
@@ -146,6 +147,26 @@ impl<'a> Cursor<'a> {
146
147
} ;
147
148
match state {
148
149
State :: Start => {
150
+ if let Some ( t) = lookup:: punctuation_kind ( c) {
151
+ token. kind = t;
152
+ token. data = self . current_str ( ) ;
153
+ return Ok ( token) ;
154
+ }
155
+
156
+ if lookup:: is_namestart ( c) {
157
+ token. kind = TokenKind :: Name ;
158
+ state = State :: Ident ;
159
+
160
+ continue ;
161
+ }
162
+
163
+ if c != '0' && c. is_ascii_digit ( ) {
164
+ token. kind = TokenKind :: Int ;
165
+ state = State :: IntegerPart ;
166
+
167
+ continue ;
168
+ }
169
+
149
170
match c {
150
171
'"' => {
151
172
token. kind = TokenKind :: StringValue ;
@@ -159,14 +180,6 @@ impl<'a> Cursor<'a> {
159
180
token. kind = TokenKind :: Spread ;
160
181
state = State :: SpreadOperator ;
161
182
}
162
- c if is_whitespace_assimilated ( c) => {
163
- token. kind = TokenKind :: Whitespace ;
164
- state = State :: Whitespace ;
165
- }
166
- c if is_name_start ( c) => {
167
- token. kind = TokenKind :: Name ;
168
- state = State :: Ident ;
169
- }
170
183
'-' => {
171
184
token. kind = TokenKind :: Int ;
172
185
state = State :: MinusSign ;
@@ -175,79 +188,9 @@ impl<'a> Cursor<'a> {
175
188
token. kind = TokenKind :: Int ;
176
189
state = State :: LeadingZero ;
177
190
}
178
- c if c. is_ascii_digit ( ) => {
179
- token. kind = TokenKind :: Int ;
180
- state = State :: IntegerPart ;
181
- }
182
- '!' => {
183
- token. kind = TokenKind :: Bang ;
184
- token. data = self . current_str ( ) ;
185
- return Ok ( token) ;
186
- }
187
- '$' => {
188
- token. kind = TokenKind :: Dollar ;
189
- token. data = self . current_str ( ) ;
190
- return Ok ( token) ;
191
- }
192
- '&' => {
193
- token. kind = TokenKind :: Amp ;
194
- token. data = self . current_str ( ) ;
195
- return Ok ( token) ;
196
- }
197
- '(' => {
198
- token. kind = TokenKind :: LParen ;
199
- token. data = self . current_str ( ) ;
200
- return Ok ( token) ;
201
- }
202
- ')' => {
203
- token. kind = TokenKind :: RParen ;
204
- token. data = self . current_str ( ) ;
205
- return Ok ( token) ;
206
- }
207
- ':' => {
208
- token. kind = TokenKind :: Colon ;
209
- token. data = self . current_str ( ) ;
210
- return Ok ( token) ;
211
- }
212
- ',' => {
213
- token. kind = TokenKind :: Comma ;
214
- token. data = self . current_str ( ) ;
215
- return Ok ( token) ;
216
- }
217
- '=' => {
218
- token. kind = TokenKind :: Eq ;
219
- token. data = self . current_str ( ) ;
220
- return Ok ( token) ;
221
- }
222
- '@' => {
223
- token. kind = TokenKind :: At ;
224
- token. data = self . current_str ( ) ;
225
- return Ok ( token) ;
226
- }
227
- '[' => {
228
- token. kind = TokenKind :: LBracket ;
229
- token. data = self . current_str ( ) ;
230
- return Ok ( token) ;
231
- }
232
- ']' => {
233
- token. kind = TokenKind :: RBracket ;
234
- token. data = self . current_str ( ) ;
235
- return Ok ( token) ;
236
- }
237
- '{' => {
238
- token. kind = TokenKind :: LCurly ;
239
- token. data = self . current_str ( ) ;
240
- return Ok ( token) ;
241
- }
242
- '|' => {
243
- token. kind = TokenKind :: Pipe ;
244
- token. data = self . current_str ( ) ;
245
- return Ok ( token) ;
246
- }
247
- '}' => {
248
- token. kind = TokenKind :: RCurly ;
249
- token. data = self . current_str ( ) ;
250
- return Ok ( token) ;
191
+ c if is_whitespace_assimilated ( c) => {
192
+ token. kind = TokenKind :: Whitespace ;
193
+ state = State :: Whitespace ;
251
194
}
252
195
c => {
253
196
return Err ( Error :: new (
@@ -412,7 +355,7 @@ impl<'a> Cursor<'a> {
412
355
self . current_str ( ) . to_string ( ) ,
413
356
) ) ;
414
357
}
415
- _ if is_name_start ( c) => {
358
+ _ if lookup :: is_namestart ( c) => {
416
359
return Err ( Error :: new (
417
360
format ! ( "Unexpected character `{c}` as integer suffix" ) ,
418
361
self . current_str ( ) . to_string ( ) ,
@@ -433,7 +376,7 @@ impl<'a> Cursor<'a> {
433
376
token. kind = TokenKind :: Float ;
434
377
state = State :: ExponentIndicator ;
435
378
}
436
- _ if is_name_start ( c) => {
379
+ _ if lookup :: is_namestart ( c) => {
437
380
return Err ( Error :: new (
438
381
format ! ( "Unexpected character `{c}` as integer suffix" ) ,
439
382
self . current_str ( ) . to_string ( ) ,
@@ -460,7 +403,7 @@ impl<'a> Cursor<'a> {
460
403
'e' | 'E' => {
461
404
state = State :: ExponentIndicator ;
462
405
}
463
- _ if c == '.' || is_name_start ( c) => {
406
+ _ if c == '.' || lookup :: is_namestart ( c) => {
464
407
return Err ( Error :: new (
465
408
format ! ( "Unexpected character `{c}` as float suffix" ) ,
466
409
self . current_str ( ) . to_string ( ) ,
@@ -500,7 +443,7 @@ impl<'a> Cursor<'a> {
500
443
_ if c. is_ascii_digit ( ) => {
501
444
state = State :: ExponentDigit ;
502
445
}
503
- _ if c == '.' || is_name_start ( c) => {
446
+ _ if c == '.' || lookup :: is_namestart ( c) => {
504
447
return Err ( Error :: new (
505
448
format ! ( "Unexpected character `{c}` as float suffix" ) ,
506
449
self . current_str ( ) . to_string ( ) ,
@@ -641,11 +584,6 @@ fn is_whitespace_assimilated(c: char) -> bool {
641
584
)
642
585
}
643
586
644
- /// <https://spec.graphql.org/October2021/#NameStart>
645
- fn is_name_start ( c : char ) -> bool {
646
- matches ! ( c, 'a' ..='z' | 'A' ..='Z' | '_' )
647
- }
648
-
649
587
/// <https://spec.graphql.org/October2021/#NameContinue>
650
588
fn is_name_continue ( c : char ) -> bool {
651
589
matches ! ( c, 'a' ..='z' | 'A' ..='Z' | '0' ..='9' | '_' )
0 commit comments