@@ -195,7 +195,7 @@ macro_rules! dispatch_on_enum_state(
195
195
match $s {
196
196
$(
197
197
$st => match $c {
198
- $stc => $_self. move_to( $is( $next_st) ) ,
198
+ $stc => Ok ( $_self. move_to( $is( $next_st) ) ) ,
199
199
_ => $_self. handle_error( $chunk, $c)
200
200
} ,
201
201
) +
@@ -349,7 +349,7 @@ impl Lexer {
349
349
Ok ( Some ( Token :: Character ( ']' ) ) ) ,
350
350
State :: InvalidCDataClosing ( ClosingSubstate :: Second ) => {
351
351
self . eof_handled = false ;
352
- self . move_to_with_unread ( State :: Normal , & [ ']' ] , Token :: Character ( ']' ) )
352
+ Ok ( self . move_to_with_unread ( State :: Normal , & [ ']' ] , Token :: Character ( ']' ) ) )
353
353
} ,
354
354
State :: Normal =>
355
355
Ok ( None ) ,
@@ -368,46 +368,46 @@ impl Lexer {
368
368
#[ inline( never) ]
369
369
fn dispatch_char ( & mut self , c : char ) -> Result {
370
370
match self . st {
371
- State :: Normal => self . normal ( c) ,
371
+ State :: Normal => Ok ( self . normal ( c) ) ,
372
372
State :: TagStarted => self . tag_opened ( c) ,
373
- State :: EmptyTagClosing => self . empty_element_closing ( c) ,
373
+ State :: EmptyTagClosing => Ok ( self . empty_element_closing ( c) ) ,
374
374
State :: CommentOrCDataOrDoctypeStarted => self . comment_or_cdata_or_doctype_started ( c) ,
375
- State :: InsideCdata => self . inside_cdata ( c) ,
375
+ State :: InsideCdata => Ok ( self . inside_cdata ( c) ) ,
376
376
State :: CDataStarted ( s) => self . cdata_started ( c, s) ,
377
- State :: InsideComment => self . inside_comment_state ( c) ,
377
+ State :: InsideComment => Ok ( self . inside_comment_state ( c) ) ,
378
378
State :: CommentStarted => self . comment_started ( c) ,
379
- State :: InsideProcessingInstruction => self . inside_processing_instruction ( c) ,
380
- State :: ProcessingInstructionClosing => self . processing_instruction_closing ( c) ,
379
+ State :: InsideProcessingInstruction => Ok ( self . inside_processing_instruction ( c) ) ,
380
+ State :: ProcessingInstructionClosing => Ok ( self . processing_instruction_closing ( c) ) ,
381
381
State :: CommentClosing ( s) => self . comment_closing ( c, s) ,
382
- State :: CDataClosing ( s) => self . cdata_closing ( c, s) ,
383
- State :: InsideDoctype => self . inside_doctype ( c) ,
382
+ State :: CDataClosing ( s) => Ok ( self . cdata_closing ( c, s) ) ,
383
+ State :: InsideDoctype => Ok ( self . inside_doctype ( c) ) ,
384
384
State :: DoctypeStarted ( s) => self . doctype_started ( c, s) ,
385
- State :: InvalidCDataClosing ( s) => self . invalid_cdata_closing ( c, s) ,
385
+ State :: InvalidCDataClosing ( s) => Ok ( self . invalid_cdata_closing ( c, s) ) ,
386
386
State :: InsideMarkupDeclaration => self . markup_declaration ( c) ,
387
- State :: InsideMarkupDeclarationQuotedString ( q) => self . markup_declaration_string ( c, q) ,
387
+ State :: InsideMarkupDeclarationQuotedString ( q) => Ok ( self . markup_declaration_string ( c, q) ) ,
388
388
}
389
389
}
390
390
391
391
#[ inline]
392
- fn move_to ( & mut self , st : State ) -> Result {
392
+ fn move_to ( & mut self , st : State ) -> Option < Token > {
393
393
self . st = st;
394
- Ok ( None )
394
+ None
395
395
}
396
396
397
397
#[ inline]
398
- fn move_to_with ( & mut self , st : State , token : Token ) -> Result {
398
+ fn move_to_with ( & mut self , st : State , token : Token ) -> Option < Token > {
399
399
self . st = st;
400
- Ok ( Some ( token) )
400
+ Some ( token)
401
401
}
402
402
403
403
#[ inline]
404
- fn move_to_and_reset_normal ( & mut self , st : State , token : Token ) -> Result {
404
+ fn move_to_and_reset_normal ( & mut self , st : State , token : Token ) -> Option < Token > {
405
405
self . normal_state = st;
406
406
self . st = st;
407
- Ok ( Some ( token) )
407
+ Some ( token)
408
408
}
409
409
410
- fn move_to_with_unread ( & mut self , st : State , cs : & [ char ] , token : Token ) -> Result {
410
+ fn move_to_with_unread ( & mut self , st : State , cs : & [ char ] , token : Token ) -> Option < Token > {
411
411
for c in cs. iter ( ) . rev ( ) . copied ( ) {
412
412
self . char_queue . push_front ( c) ;
413
413
}
@@ -442,77 +442,77 @@ impl Lexer {
442
442
let first = chars. next ( ) . unwrap_or ( '\0' ) ;
443
443
self . char_queue . extend ( chars) ;
444
444
self . char_queue . push_back ( c) ;
445
- return self . move_to_with ( State :: Normal , Token :: Character ( first) ) ;
445
+ return Ok ( self . move_to_with ( State :: Normal , Token :: Character ( first) ) ) ;
446
446
}
447
447
Err ( self . error ( SyntaxError :: UnexpectedTokenBefore ( chunk, c) ) )
448
448
}
449
449
450
450
/// Encountered a char
451
- fn normal ( & mut self , c : char ) -> Result {
451
+ fn normal ( & mut self , c : char ) -> Option < Token > {
452
452
match c {
453
453
'<' => self . move_to ( State :: TagStarted ) ,
454
- '>' => Ok ( Some ( Token :: TagEnd ) ) ,
454
+ '>' => Some ( Token :: TagEnd ) ,
455
455
'/' => self . move_to ( State :: EmptyTagClosing ) ,
456
- '=' => Ok ( Some ( Token :: EqualsSign ) ) ,
457
- '"' => Ok ( Some ( Token :: DoubleQuote ) ) ,
458
- '\'' => Ok ( Some ( Token :: SingleQuote ) ) ,
456
+ '=' => Some ( Token :: EqualsSign ) ,
457
+ '"' => Some ( Token :: DoubleQuote ) ,
458
+ '\'' => Some ( Token :: SingleQuote ) ,
459
459
']' => self . move_to ( State :: InvalidCDataClosing ( ClosingSubstate :: First ) ) ,
460
- '&' => Ok ( Some ( Token :: ReferenceStart ) ) ,
461
- ';' => Ok ( Some ( Token :: ReferenceEnd ) ) ,
462
- _ => Ok ( Some ( Token :: Character ( c) ) )
460
+ '&' => Some ( Token :: ReferenceStart ) ,
461
+ ';' => Some ( Token :: ReferenceEnd ) ,
462
+ _ => Some ( Token :: Character ( c) )
463
463
}
464
464
}
465
465
466
- fn inside_cdata ( & mut self , c : char ) -> Result {
466
+ fn inside_cdata ( & mut self , c : char ) -> Option < Token > {
467
467
match c {
468
468
']' => self . move_to ( State :: CDataClosing ( ClosingSubstate :: First ) ) ,
469
- _ => Ok ( Some ( Token :: Character ( c) ) )
469
+ _ => Some ( Token :: Character ( c) ) ,
470
470
}
471
471
}
472
472
473
- fn inside_processing_instruction ( & mut self , c : char ) -> Result {
473
+ fn inside_processing_instruction ( & mut self , c : char ) -> Option < Token > {
474
474
// These tokens are used by `<?xml?>` parser
475
475
match c {
476
476
'?' => self . move_to ( State :: ProcessingInstructionClosing ) ,
477
- '<' => Ok ( Some ( Token :: OpeningTagStart ) ) ,
478
- '>' => Ok ( Some ( Token :: TagEnd ) ) ,
479
- '/' => Ok ( Some ( Token :: ClosingTagStart ) ) ,
480
- '=' => Ok ( Some ( Token :: EqualsSign ) ) ,
481
- '"' => Ok ( Some ( Token :: DoubleQuote ) ) ,
482
- '\'' => Ok ( Some ( Token :: SingleQuote ) ) ,
483
- '&' => Ok ( Some ( Token :: ReferenceStart ) ) ,
484
- ';' => Ok ( Some ( Token :: ReferenceEnd ) ) ,
485
- _ => Ok ( Some ( Token :: Character ( c) ) )
477
+ '<' => Some ( Token :: OpeningTagStart ) ,
478
+ '>' => Some ( Token :: TagEnd ) ,
479
+ '/' => Some ( Token :: ClosingTagStart ) ,
480
+ '=' => Some ( Token :: EqualsSign ) ,
481
+ '"' => Some ( Token :: DoubleQuote ) ,
482
+ '\'' => Some ( Token :: SingleQuote ) ,
483
+ '&' => Some ( Token :: ReferenceStart ) ,
484
+ ';' => Some ( Token :: ReferenceEnd ) ,
485
+ _ => Some ( Token :: Character ( c) )
486
486
}
487
487
}
488
488
489
- fn inside_comment_state ( & mut self , c : char ) -> Result {
489
+ fn inside_comment_state ( & mut self , c : char ) -> Option < Token > {
490
490
match c {
491
491
'-' => self . move_to ( State :: CommentClosing ( ClosingSubstate :: First ) ) ,
492
- _ => Ok ( Some ( Token :: Character ( c) ) )
492
+ _ => Some ( Token :: Character ( c) ) ,
493
493
}
494
494
}
495
495
496
496
/// Encountered '<'
497
497
fn tag_opened ( & mut self , c : char ) -> Result {
498
498
match c {
499
- '?' => self . move_to_with ( State :: InsideProcessingInstruction , Token :: ProcessingInstructionStart ) ,
500
- '/' => self . move_to_with ( self . normal_state , Token :: ClosingTagStart ) ,
501
- '!' => self . move_to ( State :: CommentOrCDataOrDoctypeStarted ) ,
502
- _ if is_whitespace_char ( c) => self . move_to_with_unread ( self . normal_state , & [ c] , Token :: OpeningTagStart ) ,
503
- _ if is_name_char ( c) => self . move_to_with_unread ( self . normal_state , & [ c] , Token :: OpeningTagStart ) ,
499
+ '?' => Ok ( self . move_to_with ( State :: InsideProcessingInstruction , Token :: ProcessingInstructionStart ) ) ,
500
+ '/' => Ok ( self . move_to_with ( self . normal_state , Token :: ClosingTagStart ) ) ,
501
+ '!' => Ok ( self . move_to ( State :: CommentOrCDataOrDoctypeStarted ) ) ,
502
+ _ if is_whitespace_char ( c) => Ok ( self . move_to_with_unread ( self . normal_state , & [ c] , Token :: OpeningTagStart ) ) ,
503
+ _ if is_name_char ( c) => Ok ( self . move_to_with_unread ( self . normal_state , & [ c] , Token :: OpeningTagStart ) ) ,
504
504
_ => self . handle_error ( "<" , c)
505
505
}
506
506
}
507
507
508
508
/// Encountered '<!'
509
509
fn comment_or_cdata_or_doctype_started ( & mut self , c : char ) -> Result {
510
510
match c {
511
- '-' => self . move_to ( State :: CommentStarted ) ,
512
- '[' => self . move_to ( State :: CDataStarted ( CDataStartedSubstate :: E ) ) ,
513
- 'D' => self . move_to ( State :: DoctypeStarted ( DoctypeStartedSubstate :: D ) ) ,
511
+ '-' => Ok ( self . move_to ( State :: CommentStarted ) ) ,
512
+ '[' => Ok ( self . move_to ( State :: CDataStarted ( CDataStartedSubstate :: E ) ) ) ,
513
+ 'D' => Ok ( self . move_to ( State :: DoctypeStarted ( DoctypeStartedSubstate :: D ) ) ) ,
514
514
'E' | 'A' | 'N' if matches ! ( self . normal_state, State :: InsideDoctype ) => {
515
- self . move_to_with_unread ( State :: InsideMarkupDeclaration , & [ c] , Token :: MarkupDeclarationStart )
515
+ Ok ( self . move_to_with_unread ( State :: InsideMarkupDeclaration , & [ c] , Token :: MarkupDeclarationStart ) )
516
516
} ,
517
517
_ => self . handle_error ( "<!" , c) ,
518
518
}
@@ -521,7 +521,7 @@ impl Lexer {
521
521
/// Encountered '<!-'
522
522
fn comment_started ( & mut self , c : char ) -> Result {
523
523
match c {
524
- '-' => self . move_to_with ( State :: InsideComment , Token :: CommentStart ) ,
524
+ '-' => Ok ( self . move_to_with ( State :: InsideComment , Token :: CommentStart ) ) ,
525
525
_ => self . handle_error ( "<!-" , c) ,
526
526
}
527
527
}
@@ -535,28 +535,28 @@ impl Lexer {
535
535
CD ; 'A' ; CDA ; "<![CD" ,
536
536
CDA ; 'T' ; CDAT ; "<![CDA" ,
537
537
CDAT ; 'A' ; CDATA ; "<![CDAT" ;
538
- CDATA ; '[' ; "<![CDATA" ; self . move_to_with( State :: InsideCdata , Token :: CDataStart )
538
+ CDATA ; '[' ; "<![CDATA" ; Ok ( self . move_to_with( State :: InsideCdata , Token :: CDataStart ) )
539
539
)
540
540
}
541
541
542
542
/// Encountered '<!…' that isn't DOCTYPE or CDATA
543
543
fn markup_declaration ( & mut self , c : char ) -> Result {
544
544
match c {
545
545
'<' => self . handle_error ( "<!" , c) ,
546
- '>' => self . move_to_with ( self . normal_state , Token :: TagEnd ) ,
546
+ '>' => Ok ( self . move_to_with ( self . normal_state , Token :: TagEnd ) ) ,
547
547
'&' => Ok ( Some ( Token :: ReferenceStart ) ) ,
548
548
';' => Ok ( Some ( Token :: ReferenceEnd ) ) ,
549
- '"' => self . move_to_with ( State :: InsideMarkupDeclarationQuotedString ( QuoteStyle :: Double ) , Token :: DoubleQuote ) ,
550
- '\'' => self . move_to_with ( State :: InsideMarkupDeclarationQuotedString ( QuoteStyle :: Single ) , Token :: SingleQuote ) ,
549
+ '"' => Ok ( self . move_to_with ( State :: InsideMarkupDeclarationQuotedString ( QuoteStyle :: Double ) , Token :: DoubleQuote ) ) ,
550
+ '\'' => Ok ( self . move_to_with ( State :: InsideMarkupDeclarationQuotedString ( QuoteStyle :: Single ) , Token :: SingleQuote ) ) ,
551
551
_ => Ok ( Some ( Token :: Character ( c) ) ) ,
552
552
}
553
553
}
554
554
555
- fn markup_declaration_string ( & mut self , c : char , q : QuoteStyle ) -> Result {
555
+ fn markup_declaration_string ( & mut self , c : char , q : QuoteStyle ) -> Option < Token > {
556
556
match c {
557
557
'"' if q == QuoteStyle :: Double => self . move_to_with ( State :: InsideMarkupDeclaration , Token :: DoubleQuote ) ,
558
558
'\'' if q == QuoteStyle :: Single => self . move_to_with ( State :: InsideMarkupDeclaration , Token :: SingleQuote ) ,
559
- _ => Ok ( Some ( Token :: Character ( c) ) ) ,
559
+ _ => Some ( Token :: Character ( c) ) ,
560
560
}
561
561
}
562
562
@@ -569,33 +569,33 @@ impl Lexer {
569
569
DOC ; 'T' ; DOCT ; "<!DOC" ,
570
570
DOCT ; 'Y' ; DOCTY ; "<!DOCT" ,
571
571
DOCTY ; 'P' ; DOCTYP ; "<!DOCTY" ;
572
- DOCTYP ; 'E' ; "<!DOCTYP" ; self . move_to_and_reset_normal( State :: InsideDoctype , Token :: DoctypeStart )
572
+ DOCTYP ; 'E' ; "<!DOCTYP" ; Ok ( self . move_to_and_reset_normal( State :: InsideDoctype , Token :: DoctypeStart ) )
573
573
)
574
574
}
575
575
576
576
/// State used while awaiting the closing bracket for the <!DOCTYPE tag
577
- fn inside_doctype ( & mut self , c : char ) -> Result {
577
+ fn inside_doctype ( & mut self , c : char ) -> Option < Token > {
578
578
match c {
579
579
'>' => self . move_to_and_reset_normal ( State :: Normal , Token :: TagEnd ) ,
580
580
'<' => self . move_to ( State :: TagStarted ) ,
581
- '&' => Ok ( Some ( Token :: ReferenceStart ) ) ,
582
- ';' => Ok ( Some ( Token :: ReferenceEnd ) ) ,
583
- '"' => Ok ( Some ( Token :: DoubleQuote ) ) ,
584
- '\'' => Ok ( Some ( Token :: SingleQuote ) ) ,
585
- _ => Ok ( Some ( Token :: Character ( c) ) ) ,
581
+ '&' => Some ( Token :: ReferenceStart ) ,
582
+ ';' => Some ( Token :: ReferenceEnd ) ,
583
+ '"' => Some ( Token :: DoubleQuote ) ,
584
+ '\'' => Some ( Token :: SingleQuote ) ,
585
+ _ => Some ( Token :: Character ( c) ) ,
586
586
}
587
587
}
588
588
589
589
/// Encountered '?'
590
- fn processing_instruction_closing ( & mut self , c : char ) -> Result {
590
+ fn processing_instruction_closing ( & mut self , c : char ) -> Option < Token > {
591
591
match c {
592
592
'>' => self . move_to_with ( self . normal_state , Token :: ProcessingInstructionEnd ) ,
593
593
_ => self . move_to_with_unread ( State :: InsideProcessingInstruction , & [ c] , Token :: Character ( '?' ) ) ,
594
594
}
595
595
}
596
596
597
597
/// Encountered '/'
598
- fn empty_element_closing ( & mut self , c : char ) -> Result {
598
+ fn empty_element_closing ( & mut self , c : char ) -> Option < Token > {
599
599
match c {
600
600
'>' => self . move_to_with ( self . normal_state , Token :: EmptyTagEnd ) ,
601
601
_ => self . move_to_with_unread ( self . normal_state , & [ c] , Token :: Character ( '/' ) ) ,
@@ -606,19 +606,19 @@ impl Lexer {
606
606
fn comment_closing ( & mut self , c : char , s : ClosingSubstate ) -> Result {
607
607
match s {
608
608
ClosingSubstate :: First => match c {
609
- '-' => self . move_to ( State :: CommentClosing ( ClosingSubstate :: Second ) ) ,
610
- _ => self . move_to_with_unread ( State :: InsideComment , & [ c] , Token :: Character ( '-' ) ) ,
609
+ '-' => Ok ( self . move_to ( State :: CommentClosing ( ClosingSubstate :: Second ) ) ) ,
610
+ _ => Ok ( self . move_to_with_unread ( State :: InsideComment , & [ c] , Token :: Character ( '-' ) ) ) ,
611
611
} ,
612
612
ClosingSubstate :: Second => match c {
613
- '>' => self . move_to_with ( self . normal_state , Token :: CommentEnd ) ,
613
+ '>' => Ok ( self . move_to_with ( self . normal_state , Token :: CommentEnd ) ) ,
614
614
// double dash not followed by a greater-than is a hard error inside comment
615
615
_ => self . handle_error ( "--" , c) ,
616
616
} ,
617
617
}
618
618
}
619
619
620
620
/// Encountered ']'
621
- fn cdata_closing ( & mut self , c : char , s : ClosingSubstate ) -> Result {
621
+ fn cdata_closing ( & mut self , c : char , s : ClosingSubstate ) -> Option < Token > {
622
622
match s {
623
623
ClosingSubstate :: First => match c {
624
624
']' => self . move_to ( State :: CDataClosing ( ClosingSubstate :: Second ) ) ,
@@ -632,7 +632,7 @@ impl Lexer {
632
632
}
633
633
634
634
/// Encountered ']'
635
- fn invalid_cdata_closing ( & mut self , c : char , s : ClosingSubstate ) -> Result {
635
+ fn invalid_cdata_closing ( & mut self , c : char , s : ClosingSubstate ) -> Option < Token > {
636
636
match s {
637
637
ClosingSubstate :: First => match c {
638
638
']' => self . move_to ( State :: InvalidCDataClosing ( ClosingSubstate :: Second ) ) ,
0 commit comments