Add "explicit" flag to Event::DocumentStart (#5)

Allows the event consumer to know whether the document explicitly starts with a `---`
This commit is contained in:
Eduardo Sánchez Muñoz 2024-08-05 17:23:04 +02:00 committed by GitHub
parent 926fdfb01b
commit 6c57b5b5e4
5 changed files with 32 additions and 26 deletions

View file

@ -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<T: Input> Parser<T> {
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 <document-start>",
@ -599,7 +605,7 @@ impl<T: Input> Parser<T> {
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<T: Input> Parser<T> {
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,

View file

@ -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,

View file

@ -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),

View file

@ -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,

View file

@ -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) => {