diff --git a/parser/src/parser.rs b/parser/src/parser.rs index 6aae44d..9bdf9a6 100644 --- a/parser/src/parser.rs +++ b/parser/src/parser.rs @@ -49,8 +49,14 @@ pub enum Event { StreamStart, /// Last event that will be generated by the parser. Signals EOF. StreamEnd, - /// The YAML start document directive (`---`). - DocumentStart, + /// The start of a YAML document. + /// + /// When the boolean is `true`, it is an explicit document start + /// directive (`---`). + /// + /// When the boolean is `false`, it is an implicit document start + /// (without `---`). + DocumentStart(bool), /// The YAML end document directive (`...`). DocumentEnd, /// A YAML Alias. @@ -441,7 +447,7 @@ impl Parser { span: Span, recv: &mut R, ) -> Result<(), ScanError> { - if first_ev != Event::DocumentStart { + if !matches!(first_ev, Event::DocumentStart(_)) { return Err(ScanError::new_str( span.start, "did not find expected ", @@ -599,7 +605,7 @@ impl Parser { self.parser_process_directives()?; self.push_state(State::DocumentEnd); self.state = State::BlockNode; - Ok((Event::DocumentStart, span)) + Ok((Event::DocumentStart(false), span)) } _ => { // explicit document @@ -648,7 +654,7 @@ impl Parser { self.push_state(State::DocumentEnd); self.state = State::DocumentContent; self.skip(); - Ok((Event::DocumentStart, mark)) + Ok((Event::DocumentStart(true), mark)) } Token(span, _) => Err(ScanError::new_str( span.start, diff --git a/parser/tests/basic.rs b/parser/tests/basic.rs index 9782a32..010b1cb 100644 --- a/parser/tests/basic.rs +++ b/parser/tests/basic.rs @@ -45,7 +45,7 @@ fn test_empty_doc() { run_parser("---").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(true), Event::Scalar("~".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, Event::StreamEnd, @@ -59,7 +59,7 @@ fn test_utf() { run_parser("a: 你好").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::MappingStart(0, None), Event::Scalar("a".to_string(), TScalarStyle::Plain, 0, None), Event::Scalar("你好".to_string(), TScalarStyle::Plain, 0, None), @@ -83,7 +83,7 @@ a: b # This is another comment run_parser(s).unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::MappingStart(0, None), Event::Scalar("a".to_string(), TScalarStyle::Plain, 0, None), Event::Scalar("b".to_string(), TScalarStyle::Plain, 0, None), @@ -106,7 +106,7 @@ fn test_quoting() { run_parser(s).unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::SequenceStart(0, None), Event::Scalar("plain".to_string(), TScalarStyle::Plain, 0, None), Event::Scalar("squote".to_string(), TScalarStyle::SingleQuoted, 0, None), @@ -131,13 +131,13 @@ a scalar run_parser(s).unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::Scalar("a scalar".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, - Event::DocumentStart, + Event::DocumentStart(true), Event::Scalar("a scalar".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, - Event::DocumentStart, + Event::DocumentStart(true), Event::Scalar("a scalar".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, Event::StreamEnd, @@ -152,7 +152,7 @@ fn test_github_27() { run_parser("&a").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::Scalar(String::new(), TScalarStyle::Plain, 1, None), Event::DocumentEnd, Event::StreamEnd, @@ -194,7 +194,7 @@ foobar"; run_parser(s).unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(true), Event::Scalar("foobar".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, Event::StreamEnd, @@ -218,7 +218,7 @@ a: |- run_parser(s).unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::MappingStart(0, None), Event::Scalar("a".to_string(), TScalarStyle::Plain, 0, None), Event::Scalar("a\n b".to_string(), TScalarStyle::Literal, 0, None), @@ -236,7 +236,7 @@ fn test_bad_docstart() { run_parser("----").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::Scalar("----".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, Event::StreamEnd, @@ -247,7 +247,7 @@ fn test_bad_docstart() { run_parser("--- #comment").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(true), Event::Scalar("~".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, Event::StreamEnd, @@ -258,7 +258,7 @@ fn test_bad_docstart() { run_parser("---- #comment").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::Scalar("----".to_string(), TScalarStyle::Plain, 0, None), Event::DocumentEnd, Event::StreamEnd, diff --git a/parser/tests/issues.rs b/parser/tests/issues.rs index ce7c6df..8197a56 100644 --- a/parser/tests/issues.rs +++ b/parser/tests/issues.rs @@ -34,7 +34,7 @@ fn test_issue1() { let expected = [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::SequenceStart(0, None), Event::MappingStart(0, None), Event::Scalar("a".to_string(), TScalarStyle::Plain, 0, None), @@ -57,7 +57,7 @@ fn test_issue1() { run_parser("[foo: [bar]]: baz").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::MappingStart(0, None), Event::SequenceStart(0, None), Event::MappingStart(0, None), @@ -79,7 +79,7 @@ fn test_issue1() { run_parser("[:]").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::SequenceStart(0, None), Event::MappingStart(0, None), Event::Scalar("~".to_string(), TScalarStyle::Plain, 0, None), @@ -96,7 +96,7 @@ fn test_issue1() { run_parser("[: [:]]").unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::SequenceStart(0, None), Event::MappingStart(0, None), Event::Scalar("~".to_string(), TScalarStyle::Plain, 0, None), @@ -123,7 +123,7 @@ fn test_issue1() { // third nested sequences, but not the second. [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::SequenceStart(0, None), Event::MappingStart(0, None), Event::Scalar("a".to_string(), TScalarStyle::Plain, 0, None), @@ -153,7 +153,7 @@ fn test_issue1() { run_parser(r#"["a":[]]"#).unwrap(), [ Event::StreamStart, - Event::DocumentStart, + Event::DocumentStart(false), Event::SequenceStart(0, None), Event::MappingStart(0, None), Event::Scalar("a".to_string(), TScalarStyle::DoubleQuoted, 0, None), diff --git a/parser/tests/spec_test.rs b/parser/tests/spec_test.rs index bdf36b0..4d2876e 100644 --- a/parser/tests/spec_test.rs +++ b/parser/tests/spec_test.rs @@ -26,7 +26,7 @@ struct YamlChecker { impl EventReceiver for YamlChecker { fn on_event(&mut self, ev: Event) { let tev = match ev { - Event::DocumentStart => TestEvent::OnDocumentStart, + Event::DocumentStart(_) => TestEvent::OnDocumentStart, Event::DocumentEnd => TestEvent::OnDocumentEnd, Event::SequenceStart(..) => TestEvent::OnSequenceStart, Event::SequenceEnd => TestEvent::OnSequenceEnd, diff --git a/parser/tests/yaml-test-suite.rs b/parser/tests/yaml-test-suite.rs index 276581f..5521433 100644 --- a/parser/tests/yaml-test-suite.rs +++ b/parser/tests/yaml-test-suite.rs @@ -142,7 +142,7 @@ impl EventReceiver for EventReporter { Event::StreamStart => "+STR".into(), Event::StreamEnd => "-STR".into(), - Event::DocumentStart => "+DOC".into(), + Event::DocumentStart(_) => "+DOC".into(), Event::DocumentEnd => "-DOC".into(), Event::SequenceStart(idx, tag) => {