1use crate::{
8 input::{str::StrInput, Input},
9 scanner::{ScanError, Scanner, Span, TScalarStyle, Token, TokenType},
10 BufferedInput, Marker,
11};
12
13use std::collections::HashMap;
14
15#[derive(Clone, Copy, PartialEq, Debug, Eq)]
16enum State {
17 StreamStart,
18 ImplicitDocumentStart,
19 DocumentStart,
20 DocumentContent,
21 DocumentEnd,
22 BlockNode,
23 BlockSequenceFirstEntry,
24 BlockSequenceEntry,
25 IndentlessSequenceEntry,
26 BlockMappingFirstKey,
27 BlockMappingKey,
28 BlockMappingValue,
29 FlowSequenceFirstEntry,
30 FlowSequenceEntry,
31 FlowSequenceEntryMappingKey,
32 FlowSequenceEntryMappingValue,
33 FlowSequenceEntryMappingEnd(Marker),
34 FlowMappingFirstKey,
35 FlowMappingKey,
36 FlowMappingValue,
37 FlowMappingEmptyValue,
38 End,
39}
40
41#[derive(Clone, PartialEq, Debug, Eq)]
46pub enum Event {
47 Nothing,
49 StreamStart,
51 StreamEnd,
53 DocumentStart(bool),
61 DocumentEnd,
63 Alias(
65 usize,
67 ),
68 Scalar(String, TScalarStyle, usize, Option<Tag>),
70 SequenceStart(
72 usize,
74 Option<Tag>,
76 ),
77 SequenceEnd,
79 MappingStart(
81 usize,
83 Option<Tag>,
85 ),
86 MappingEnd,
88}
89
90#[derive(Clone, PartialEq, Debug, Eq)]
92pub struct Tag {
93 pub handle: String,
95 pub suffix: String,
97}
98
99impl Event {
100 fn empty_scalar() -> Event {
102 Event::Scalar("~".to_owned(), TScalarStyle::Plain, 0, None)
104 }
105
106 fn empty_scalar_with_anchor(anchor: usize, tag: Option<Tag>) -> Event {
108 Event::Scalar(String::new(), TScalarStyle::Plain, anchor, tag)
109 }
110}
111
112#[derive(Debug)]
114pub struct Parser<T: Input> {
115 scanner: Scanner<T>,
117 states: Vec<State>,
122 state: State,
124 token: Option<Token>,
126 current: Option<(Event, Span)>,
128 anchors: HashMap<String, usize>,
130 anchor_id_count: usize,
135 tags: HashMap<String, String>,
139 stream_end_emitted: bool,
144 keep_tags: bool,
146}
147
148pub trait EventReceiver {
218 fn on_event(&mut self, ev: Event);
220}
221
222pub trait SpannedEventReceiver {
226 fn on_event(&mut self, ev: Event, span: Span);
228}
229
230impl<R: EventReceiver> SpannedEventReceiver for R {
231 fn on_event(&mut self, ev: Event, _span: Span) {
232 self.on_event(ev);
233 }
234}
235
236pub type ParseResult = Result<(Event, Span), ScanError>;
238
239impl<'a> Parser<StrInput<'a>> {
240 #[must_use]
242 pub fn new_from_str(value: &'a str) -> Self {
243 debug_print!("\x1B[;31m>>>>>>>>>> New parser from str\x1B[;0m");
244 Parser::new(StrInput::new(value))
245 }
246}
247
248impl<T> Parser<BufferedInput<T>>
249where
250 T: Iterator<Item = char>,
251{
252 #[must_use]
254 pub fn new_from_iter(iter: T) -> Self {
255 debug_print!("\x1B[;31m>>>>>>>>>> New parser from iter\x1B[;0m");
256 Parser::new(BufferedInput::new(iter))
257 }
258}
259
260impl<T: Input> Parser<T> {
261 pub fn new(src: T) -> Parser<T> {
263 Parser {
264 scanner: Scanner::new(src),
265 states: Vec::new(),
266 state: State::StreamStart,
267 token: None,
268 current: None,
269
270 anchors: HashMap::new(),
271 anchor_id_count: 1,
273 tags: HashMap::new(),
274 stream_end_emitted: false,
275 keep_tags: false,
276 }
277 }
278
279 #[must_use]
302 pub fn keep_tags(mut self, value: bool) -> Self {
303 self.keep_tags = value;
304 self
305 }
306
307 pub fn peek(&mut self) -> Option<Result<&(Event, Span), ScanError>> {
315 if let Some(ref x) = self.current {
316 Some(Ok(x))
317 } else {
318 if self.stream_end_emitted {
319 return None;
320 }
321 match self.next_event_impl() {
322 Ok(token) => self.current = Some(token),
323 Err(e) => return Some(Err(e)),
324 }
325 self.current.as_ref().map(Ok)
326 }
327 }
328
329 pub fn next_event(&mut self) -> Option<ParseResult> {
334 if self.stream_end_emitted {
335 return None;
336 }
337
338 let tok = self.next_event_impl();
339 if matches!(tok, Ok((Event::StreamEnd, _))) {
340 self.stream_end_emitted = true;
341 }
342 Some(tok)
343 }
344
345 fn next_event_impl(&mut self) -> ParseResult {
351 match self.current.take() {
352 None => self.parse(),
353 Some(v) => Ok(v),
354 }
355 }
356
357 fn peek_token(&mut self) -> Result<&Token, ScanError> {
359 match self.token {
360 None => {
361 self.token = Some(self.scan_next_token()?);
362 Ok(self.token.as_ref().unwrap())
363 }
364 Some(ref tok) => Ok(tok),
365 }
366 }
367
368 fn scan_next_token(&mut self) -> Result<Token, ScanError> {
372 let token = self.scanner.next();
373 match token {
374 None => match self.scanner.get_error() {
375 None => Err(ScanError::new_str(self.scanner.mark(), "unexpected eof")),
376 Some(e) => Err(e),
377 },
378 Some(tok) => Ok(tok),
379 }
380 }
381
382 fn fetch_token(&mut self) -> Token {
383 self.token
384 .take()
385 .expect("fetch_token needs to be preceded by peek_token")
386 }
387
388 fn skip(&mut self) {
390 self.token = None;
391 }
392 fn pop_state(&mut self) {
394 self.state = self.states.pop().unwrap();
395 }
396 fn push_state(&mut self, state: State) {
398 self.states.push(state);
399 }
400
401 fn parse(&mut self) -> ParseResult {
402 if self.state == State::End {
403 return Ok((Event::StreamEnd, Span::empty(self.scanner.mark())));
404 }
405 let (ev, mark) = self.state_machine()?;
406 Ok((ev, mark))
407 }
408
409 pub fn load<R: SpannedEventReceiver>(
422 &mut self,
423 recv: &mut R,
424 multi: bool,
425 ) -> Result<(), ScanError> {
426 if !self.scanner.stream_started() {
427 let (ev, span) = self.next_event_impl()?;
428 if ev != Event::StreamStart {
429 return Err(ScanError::new_str(
430 span.start,
431 "did not find expected <stream-start>",
432 ));
433 }
434 recv.on_event(ev, span);
435 }
436
437 if self.scanner.stream_ended() {
438 recv.on_event(Event::StreamEnd, Span::empty(self.scanner.mark()));
440 return Ok(());
441 }
442 loop {
443 let (ev, span) = self.next_event_impl()?;
444 if ev == Event::StreamEnd {
445 recv.on_event(ev, span);
446 return Ok(());
447 }
448 self.anchors.clear();
450 self.load_document(ev, span, recv)?;
451 if !multi {
452 break;
453 }
454 }
455 Ok(())
456 }
457
458 fn load_document<R: SpannedEventReceiver>(
459 &mut self,
460 first_ev: Event,
461 span: Span,
462 recv: &mut R,
463 ) -> Result<(), ScanError> {
464 if !matches!(first_ev, Event::DocumentStart(_)) {
465 return Err(ScanError::new_str(
466 span.start,
467 "did not find expected <document-start>",
468 ));
469 }
470 recv.on_event(first_ev, span);
471
472 let (ev, span) = self.next_event_impl()?;
473 self.load_node(ev, span, recv)?;
474
475 let (ev, mark) = self.next_event_impl()?;
477 assert_eq!(ev, Event::DocumentEnd);
478 recv.on_event(ev, mark);
479
480 Ok(())
481 }
482
483 fn load_node<R: SpannedEventReceiver>(
484 &mut self,
485 first_ev: Event,
486 span: Span,
487 recv: &mut R,
488 ) -> Result<(), ScanError> {
489 match first_ev {
490 Event::Alias(..) | Event::Scalar(..) => {
491 recv.on_event(first_ev, span);
492 Ok(())
493 }
494 Event::SequenceStart(..) => {
495 recv.on_event(first_ev, span);
496 self.load_sequence(recv)
497 }
498 Event::MappingStart(..) => {
499 recv.on_event(first_ev, span);
500 self.load_mapping(recv)
501 }
502 _ => {
503 println!("UNREACHABLE EVENT: {first_ev:?}");
504 unreachable!();
505 }
506 }
507 }
508
509 fn load_mapping<R: SpannedEventReceiver>(&mut self, recv: &mut R) -> Result<(), ScanError> {
510 let (mut key_ev, mut key_mark) = self.next_event_impl()?;
511 while key_ev != Event::MappingEnd {
512 self.load_node(key_ev, key_mark, recv)?;
514
515 let (ev, mark) = self.next_event_impl()?;
517 self.load_node(ev, mark, recv)?;
518
519 let (ev, mark) = self.next_event_impl()?;
521 key_ev = ev;
522 key_mark = mark;
523 }
524 recv.on_event(key_ev, key_mark);
525 Ok(())
526 }
527
528 fn load_sequence<R: SpannedEventReceiver>(&mut self, recv: &mut R) -> Result<(), ScanError> {
529 let (mut ev, mut mark) = self.next_event_impl()?;
530 while ev != Event::SequenceEnd {
531 self.load_node(ev, mark, recv)?;
532
533 let (next_ev, next_mark) = self.next_event_impl()?;
535 ev = next_ev;
536 mark = next_mark;
537 }
538 recv.on_event(ev, mark);
539 Ok(())
540 }
541
542 fn state_machine(&mut self) -> ParseResult {
543 debug_print!("\n\x1B[;33mParser state: {:?} \x1B[;0m", self.state);
546
547 match self.state {
548 State::StreamStart => self.stream_start(),
549
550 State::ImplicitDocumentStart => self.document_start(true),
551 State::DocumentStart => self.document_start(false),
552 State::DocumentContent => self.document_content(),
553 State::DocumentEnd => self.document_end(),
554
555 State::BlockNode => self.parse_node(true, false),
556 State::BlockMappingFirstKey => self.block_mapping_key(true),
559 State::BlockMappingKey => self.block_mapping_key(false),
560 State::BlockMappingValue => self.block_mapping_value(),
561
562 State::BlockSequenceFirstEntry => self.block_sequence_entry(true),
563 State::BlockSequenceEntry => self.block_sequence_entry(false),
564
565 State::FlowSequenceFirstEntry => self.flow_sequence_entry(true),
566 State::FlowSequenceEntry => self.flow_sequence_entry(false),
567
568 State::FlowMappingFirstKey => self.flow_mapping_key(true),
569 State::FlowMappingKey => self.flow_mapping_key(false),
570 State::FlowMappingValue => self.flow_mapping_value(false),
571
572 State::IndentlessSequenceEntry => self.indentless_sequence_entry(),
573
574 State::FlowSequenceEntryMappingKey => self.flow_sequence_entry_mapping_key(),
575 State::FlowSequenceEntryMappingValue => self.flow_sequence_entry_mapping_value(),
576 State::FlowSequenceEntryMappingEnd(mark) => self.flow_sequence_entry_mapping_end(mark),
577 State::FlowMappingEmptyValue => self.flow_mapping_value(true),
578
579 State::End => unreachable!(),
581 }
582 }
583
584 fn stream_start(&mut self) -> ParseResult {
585 match *self.peek_token()? {
586 Token(span, TokenType::StreamStart(_)) => {
587 self.state = State::ImplicitDocumentStart;
588 self.skip();
589 Ok((Event::StreamStart, span))
590 }
591 Token(span, _) => Err(ScanError::new_str(
592 span.start,
593 "did not find expected <stream-start>",
594 )),
595 }
596 }
597
598 fn document_start(&mut self, implicit: bool) -> ParseResult {
599 while let TokenType::DocumentEnd = self.peek_token()?.1 {
600 self.skip();
601 }
602
603 match *self.peek_token()? {
604 Token(span, TokenType::StreamEnd) => {
605 self.state = State::End;
606 self.skip();
607 Ok((Event::StreamEnd, span))
608 }
609 Token(
610 _,
611 TokenType::VersionDirective(..)
612 | TokenType::TagDirective(..)
613 | TokenType::DocumentStart,
614 ) => {
615 self.explicit_document_start()
617 }
618 Token(span, _) if implicit => {
619 self.parser_process_directives()?;
620 self.push_state(State::DocumentEnd);
621 self.state = State::BlockNode;
622 Ok((Event::DocumentStart(false), span))
623 }
624 _ => {
625 self.explicit_document_start()
627 }
628 }
629 }
630
631 fn parser_process_directives(&mut self) -> Result<(), ScanError> {
632 let mut version_directive_received = false;
633 loop {
634 let mut tags = HashMap::new();
635 match self.peek_token()? {
636 Token(span, TokenType::VersionDirective(_, _)) => {
637 if version_directive_received {
643 return Err(ScanError::new_str(
644 span.start,
645 "duplicate version directive",
646 ));
647 }
648 version_directive_received = true;
649 }
650 Token(mark, TokenType::TagDirective(handle, prefix)) => {
651 if tags.contains_key(handle) {
652 return Err(ScanError::new_str(mark.start, "the TAG directive must only be given at most once per handle in the same document"));
653 }
654 tags.insert(handle.to_string(), prefix.to_string());
655 }
656 _ => break,
657 }
658 self.tags = tags;
659 self.skip();
660 }
661 Ok(())
662 }
663
664 fn explicit_document_start(&mut self) -> ParseResult {
665 self.parser_process_directives()?;
666 match *self.peek_token()? {
667 Token(mark, TokenType::DocumentStart) => {
668 self.push_state(State::DocumentEnd);
669 self.state = State::DocumentContent;
670 self.skip();
671 Ok((Event::DocumentStart(true), mark))
672 }
673 Token(span, _) => Err(ScanError::new_str(
674 span.start,
675 "did not find expected <document start>",
676 )),
677 }
678 }
679
680 fn document_content(&mut self) -> ParseResult {
681 match *self.peek_token()? {
682 Token(
683 mark,
684 TokenType::VersionDirective(..)
685 | TokenType::TagDirective(..)
686 | TokenType::DocumentStart
687 | TokenType::DocumentEnd
688 | TokenType::StreamEnd,
689 ) => {
690 self.pop_state();
691 Ok((Event::empty_scalar(), mark))
693 }
694 _ => self.parse_node(true, false),
695 }
696 }
697
698 fn document_end(&mut self) -> ParseResult {
699 let mut explicit_end = false;
700 let span: Span = match *self.peek_token()? {
701 Token(span, TokenType::DocumentEnd) => {
702 explicit_end = true;
703 self.skip();
704 span
705 }
706 Token(span, _) => span,
707 };
708
709 if !self.keep_tags {
710 self.tags.clear();
711 }
712 if explicit_end {
713 self.state = State::ImplicitDocumentStart;
714 } else {
715 if let Token(span, TokenType::VersionDirective(..) | TokenType::TagDirective(..)) =
716 *self.peek_token()?
717 {
718 return Err(ScanError::new_str(
719 span.start,
720 "missing explicit document end marker before directive",
721 ));
722 }
723 self.state = State::DocumentStart;
724 }
725
726 Ok((Event::DocumentEnd, span))
727 }
728
729 fn register_anchor(&mut self, name: String, _: &Span) -> usize {
730 let new_id = self.anchor_id_count;
736 self.anchor_id_count += 1;
737 self.anchors.insert(name, new_id);
738 new_id
739 }
740
741 fn parse_node(&mut self, block: bool, indentless_sequence: bool) -> ParseResult {
742 let mut anchor_id = 0;
743 let mut tag = None;
744 match *self.peek_token()? {
745 Token(_, TokenType::Alias(_)) => {
746 self.pop_state();
747 if let Token(span, TokenType::Alias(name)) = self.fetch_token() {
748 match self.anchors.get(&name) {
749 None => {
750 return Err(ScanError::new_str(
751 span.start,
752 "while parsing node, found unknown anchor",
753 ))
754 }
755 Some(id) => return Ok((Event::Alias(*id), span)),
756 }
757 }
758 unreachable!()
759 }
760 Token(_, TokenType::Anchor(_)) => {
761 if let Token(span, TokenType::Anchor(name)) = self.fetch_token() {
762 anchor_id = self.register_anchor(name, &span);
763 if let TokenType::Tag(..) = self.peek_token()?.1 {
764 if let TokenType::Tag(handle, suffix) = self.fetch_token().1 {
765 tag = Some(self.resolve_tag(span, &handle, suffix)?);
766 } else {
767 unreachable!()
768 }
769 }
770 } else {
771 unreachable!()
772 }
773 }
774 Token(mark, TokenType::Tag(..)) => {
775 if let TokenType::Tag(handle, suffix) = self.fetch_token().1 {
776 tag = Some(self.resolve_tag(mark, &handle, suffix)?);
777 if let TokenType::Anchor(_) = &self.peek_token()?.1 {
778 if let Token(mark, TokenType::Anchor(name)) = self.fetch_token() {
779 anchor_id = self.register_anchor(name, &mark);
780 } else {
781 unreachable!()
782 }
783 }
784 } else {
785 unreachable!()
786 }
787 }
788 _ => {}
789 }
790 match *self.peek_token()? {
791 Token(mark, TokenType::BlockEntry) if indentless_sequence => {
792 self.state = State::IndentlessSequenceEntry;
793 Ok((Event::SequenceStart(anchor_id, tag), mark))
794 }
795 Token(_, TokenType::Scalar(..)) => {
796 self.pop_state();
797 if let Token(mark, TokenType::Scalar(style, v)) = self.fetch_token() {
798 Ok((Event::Scalar(v, style, anchor_id, tag), mark))
799 } else {
800 unreachable!()
801 }
802 }
803 Token(mark, TokenType::FlowSequenceStart) => {
804 self.state = State::FlowSequenceFirstEntry;
805 Ok((Event::SequenceStart(anchor_id, tag), mark))
806 }
807 Token(mark, TokenType::FlowMappingStart) => {
808 self.state = State::FlowMappingFirstKey;
809 Ok((Event::MappingStart(anchor_id, tag), mark))
810 }
811 Token(mark, TokenType::BlockSequenceStart) if block => {
812 self.state = State::BlockSequenceFirstEntry;
813 Ok((Event::SequenceStart(anchor_id, tag), mark))
814 }
815 Token(mark, TokenType::BlockMappingStart) if block => {
816 self.state = State::BlockMappingFirstKey;
817 Ok((Event::MappingStart(anchor_id, tag), mark))
818 }
819 Token(mark, _) if tag.is_some() || anchor_id > 0 => {
821 self.pop_state();
822 Ok((Event::empty_scalar_with_anchor(anchor_id, tag), mark))
823 }
824 Token(span, _) => Err(ScanError::new_str(
825 span.start,
826 "while parsing a node, did not find expected node content",
827 )),
828 }
829 }
830
831 fn block_mapping_key(&mut self, first: bool) -> ParseResult {
832 if first {
834 let _ = self.peek_token()?;
835 self.skip();
837 }
838 match *self.peek_token()? {
839 Token(_, TokenType::Key) => {
840 self.skip();
841 if let Token(mark, TokenType::Key | TokenType::Value | TokenType::BlockEnd) =
842 *self.peek_token()?
843 {
844 self.state = State::BlockMappingValue;
845 Ok((Event::empty_scalar(), mark))
847 } else {
848 self.push_state(State::BlockMappingValue);
849 self.parse_node(true, true)
850 }
851 }
852 Token(mark, TokenType::Value) => {
854 self.state = State::BlockMappingValue;
855 Ok((Event::empty_scalar(), mark))
856 }
857 Token(mark, TokenType::BlockEnd) => {
858 self.pop_state();
859 self.skip();
860 Ok((Event::MappingEnd, mark))
861 }
862 Token(span, _) => Err(ScanError::new_str(
863 span.start,
864 "while parsing a block mapping, did not find expected key",
865 )),
866 }
867 }
868
869 fn block_mapping_value(&mut self) -> ParseResult {
870 match *self.peek_token()? {
871 Token(_, TokenType::Value) => {
872 self.skip();
873 if let Token(mark, TokenType::Key | TokenType::Value | TokenType::BlockEnd) =
874 *self.peek_token()?
875 {
876 self.state = State::BlockMappingKey;
877 Ok((Event::empty_scalar(), mark))
879 } else {
880 self.push_state(State::BlockMappingKey);
881 self.parse_node(true, true)
882 }
883 }
884 Token(mark, _) => {
885 self.state = State::BlockMappingKey;
886 Ok((Event::empty_scalar(), mark))
888 }
889 }
890 }
891
892 fn flow_mapping_key(&mut self, first: bool) -> ParseResult {
893 if first {
894 let _ = self.peek_token()?;
895 self.skip();
896 }
897 let span: Span = {
898 match *self.peek_token()? {
899 Token(mark, TokenType::FlowMappingEnd) => mark,
900 Token(mark, _) => {
901 if !first {
902 match *self.peek_token()? {
903 Token(_, TokenType::FlowEntry) => self.skip(),
904 Token(span, _) => return Err(ScanError::new_str(
905 span.start,
906 "while parsing a flow mapping, did not find expected ',' or '}'",
907 )),
908 }
909 }
910
911 match *self.peek_token()? {
912 Token(_, TokenType::Key) => {
913 self.skip();
914 if let Token(
915 mark,
916 TokenType::Value | TokenType::FlowEntry | TokenType::FlowMappingEnd,
917 ) = *self.peek_token()?
918 {
919 self.state = State::FlowMappingValue;
920 return Ok((Event::empty_scalar(), mark));
921 }
922 self.push_state(State::FlowMappingValue);
923 return self.parse_node(false, false);
924 }
925 Token(marker, TokenType::Value) => {
926 self.state = State::FlowMappingValue;
927 return Ok((Event::empty_scalar(), marker));
928 }
929 Token(_, TokenType::FlowMappingEnd) => (),
930 _ => {
931 self.push_state(State::FlowMappingEmptyValue);
932 return self.parse_node(false, false);
933 }
934 }
935
936 mark
937 }
938 }
939 };
940
941 self.pop_state();
942 self.skip();
943 Ok((Event::MappingEnd, span))
944 }
945
946 fn flow_mapping_value(&mut self, empty: bool) -> ParseResult {
947 let span: Span = {
948 if empty {
949 let Token(mark, _) = *self.peek_token()?;
950 self.state = State::FlowMappingKey;
951 return Ok((Event::empty_scalar(), mark));
952 }
953 match *self.peek_token()? {
954 Token(span, TokenType::Value) => {
955 self.skip();
956 match self.peek_token()?.1 {
957 TokenType::FlowEntry | TokenType::FlowMappingEnd => {}
958 _ => {
959 self.push_state(State::FlowMappingKey);
960 return self.parse_node(false, false);
961 }
962 }
963 span
964 }
965 Token(marker, _) => marker,
966 }
967 };
968
969 self.state = State::FlowMappingKey;
970 Ok((Event::empty_scalar(), span))
971 }
972
973 fn flow_sequence_entry(&mut self, first: bool) -> ParseResult {
974 if first {
976 let _ = self.peek_token()?;
977 self.skip();
979 }
980 match *self.peek_token()? {
981 Token(mark, TokenType::FlowSequenceEnd) => {
982 self.pop_state();
983 self.skip();
984 return Ok((Event::SequenceEnd, mark));
985 }
986 Token(_, TokenType::FlowEntry) if !first => {
987 self.skip();
988 }
989 Token(span, _) if !first => {
990 return Err(ScanError::new_str(
991 span.start,
992 "while parsing a flow sequence, expected ',' or ']'",
993 ));
994 }
995 _ => { }
996 }
997 match *self.peek_token()? {
998 Token(mark, TokenType::FlowSequenceEnd) => {
999 self.pop_state();
1000 self.skip();
1001 Ok((Event::SequenceEnd, mark))
1002 }
1003 Token(mark, TokenType::Key) => {
1004 self.state = State::FlowSequenceEntryMappingKey;
1005 self.skip();
1006 Ok((Event::MappingStart(0, None), mark))
1007 }
1008 _ => {
1009 self.push_state(State::FlowSequenceEntry);
1010 self.parse_node(false, false)
1011 }
1012 }
1013 }
1014
1015 fn indentless_sequence_entry(&mut self) -> ParseResult {
1016 match *self.peek_token()? {
1017 Token(_, TokenType::BlockEntry) => (),
1018 Token(mark, _) => {
1019 self.pop_state();
1020 return Ok((Event::SequenceEnd, mark));
1021 }
1022 }
1023 self.skip();
1024 if let Token(
1025 mark,
1026 TokenType::BlockEntry | TokenType::Key | TokenType::Value | TokenType::BlockEnd,
1027 ) = *self.peek_token()?
1028 {
1029 self.state = State::IndentlessSequenceEntry;
1030 Ok((Event::empty_scalar(), mark))
1031 } else {
1032 self.push_state(State::IndentlessSequenceEntry);
1033 self.parse_node(true, false)
1034 }
1035 }
1036
1037 fn block_sequence_entry(&mut self, first: bool) -> ParseResult {
1038 if first {
1040 let _ = self.peek_token()?;
1041 self.skip();
1043 }
1044 match *self.peek_token()? {
1045 Token(mark, TokenType::BlockEnd) => {
1046 self.pop_state();
1047 self.skip();
1048 Ok((Event::SequenceEnd, mark))
1049 }
1050 Token(_, TokenType::BlockEntry) => {
1051 self.skip();
1052 if let Token(mark, TokenType::BlockEntry | TokenType::BlockEnd) =
1053 *self.peek_token()?
1054 {
1055 self.state = State::BlockSequenceEntry;
1056 Ok((Event::empty_scalar(), mark))
1057 } else {
1058 self.push_state(State::BlockSequenceEntry);
1059 self.parse_node(true, false)
1060 }
1061 }
1062 Token(span, _) => Err(ScanError::new_str(
1063 span.start,
1064 "while parsing a block collection, did not find expected '-' indicator",
1065 )),
1066 }
1067 }
1068
1069 fn flow_sequence_entry_mapping_key(&mut self) -> ParseResult {
1070 if let Token(mark, TokenType::Value | TokenType::FlowEntry | TokenType::FlowSequenceEnd) =
1071 *self.peek_token()?
1072 {
1073 self.skip();
1074 self.state = State::FlowSequenceEntryMappingValue;
1075 Ok((Event::empty_scalar(), mark))
1076 } else {
1077 self.push_state(State::FlowSequenceEntryMappingValue);
1078 self.parse_node(false, false)
1079 }
1080 }
1081
1082 fn flow_sequence_entry_mapping_value(&mut self) -> ParseResult {
1083 match *self.peek_token()? {
1084 Token(_, TokenType::Value) => {
1085 self.skip();
1086 self.state = State::FlowSequenceEntryMappingValue;
1087 let Token(span, ref tok) = *self.peek_token()?;
1088 if matches!(tok, TokenType::FlowEntry | TokenType::FlowSequenceEnd) {
1089 self.state = State::FlowSequenceEntryMappingEnd(span.end);
1090 Ok((Event::empty_scalar(), span))
1091 } else {
1092 self.push_state(State::FlowSequenceEntryMappingEnd(span.end));
1093 self.parse_node(false, false)
1094 }
1095 }
1096 Token(mark, _) => {
1097 self.state = State::FlowSequenceEntryMappingEnd(mark.end);
1098 Ok((Event::empty_scalar(), mark))
1099 }
1100 }
1101 }
1102
1103 #[allow(clippy::unnecessary_wraps)]
1104 fn flow_sequence_entry_mapping_end(&mut self, mark: Marker) -> ParseResult {
1105 self.state = State::FlowSequenceEntry;
1106 Ok((Event::MappingEnd, Span::empty(mark)))
1107 }
1108
1109 fn resolve_tag(&self, span: Span, handle: &str, suffix: String) -> Result<Tag, ScanError> {
1111 if handle == "!!" {
1112 Ok(Tag {
1115 handle: self
1116 .tags
1117 .get("!!")
1118 .map_or_else(|| "tag:yaml.org,2002:".to_string(), ToString::to_string),
1119 suffix,
1120 })
1121 } else if handle.is_empty() && suffix == "!" {
1122 match self.tags.get("") {
1124 Some(prefix) => Ok(Tag {
1125 handle: prefix.to_string(),
1126 suffix,
1127 }),
1128 None => Ok(Tag {
1129 handle: String::new(),
1130 suffix,
1131 }),
1132 }
1133 } else {
1134 let prefix = self.tags.get(handle);
1136 if let Some(prefix) = prefix {
1137 Ok(Tag {
1138 handle: prefix.to_string(),
1139 suffix,
1140 })
1141 } else {
1142 if handle.len() >= 2 && handle.starts_with('!') && handle.ends_with('!') {
1147 Err(ScanError::new_str(span.start, "the handle wasn't declared"))
1148 } else {
1149 Ok(Tag {
1150 handle: handle.to_string(),
1151 suffix,
1152 })
1153 }
1154 }
1155 }
1156 }
1157}
1158
1159impl<T: Input> Iterator for Parser<T> {
1160 type Item = Result<(Event, Span), ScanError>;
1161
1162 fn next(&mut self) -> Option<Self::Item> {
1163 self.next_event()
1164 }
1165}
1166
1167#[cfg(test)]
1168mod test {
1169 use super::{Event, Parser};
1170
1171 #[test]
1172 fn test_peek_eq_parse() {
1173 let s = "
1174a0 bb: val
1175a1: &x
1176 b1: 4
1177 b2: d
1178a2: 4
1179a3: [1, 2, 3]
1180a4:
1181 - [a1, a2]
1182 - 2
1183a5: *x
1184";
1185 let mut p = Parser::new_from_str(s);
1186 loop {
1187 let event_peek = p.peek().unwrap().unwrap().clone();
1188 let event = p.next_event().unwrap().unwrap();
1189 assert_eq!(event, event_peek);
1190 if event.0 == Event::StreamEnd {
1191 break;
1192 }
1193 }
1194 }
1195
1196 #[test]
1197 fn test_keep_tags_across_multiple_documents() {
1198 let text = r#"
1199%YAML 1.1
1200%TAG !t! tag:test,2024:
1201--- !t!1 &1
1202foo: "bar"
1203--- !t!2 &2
1204baz: "qux"
1205"#;
1206 for x in Parser::new_from_str(text).keep_tags(true) {
1207 let x = x.unwrap();
1208 if let Event::MappingStart(_, tag) = x.0 {
1209 let tag = tag.unwrap();
1210 assert_eq!(tag.handle, "tag:test,2024:");
1211 }
1212 }
1213
1214 for x in Parser::new_from_str(text).keep_tags(false) {
1215 if x.is_err() {
1216 return;
1218 }
1219 }
1220 panic!("Test failed, did not encounter error")
1221 }
1222}