Skip to content

Commit

Permalink
Add "explicit" flag to Event::DocumentStart (#5)
Browse files Browse the repository at this point in the history
Allows the event consumer to know whether the document explicitly starts with a `---`
  • Loading branch information
eduardosm authored Aug 5, 2024
1 parent 926fdfb commit 6c57b5b
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 26 deletions.
16 changes: 11 additions & 5 deletions parser/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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>",
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
26 changes: 13 additions & 13 deletions parser/tests/basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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),
Expand All @@ -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),
Expand All @@ -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),
Expand All @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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),
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down
12 changes: 6 additions & 6 deletions parser/tests/issues.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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),
Expand All @@ -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),
Expand All @@ -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),
Expand All @@ -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),
Expand Down Expand Up @@ -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),
Expand Down
2 changes: 1 addition & 1 deletion parser/tests/spec_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion parser/tests/yaml-test-suite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down

0 comments on commit 6c57b5b

Please sign in to comment.