From 9da84a3b419d54afeda9b7f36cbd2f8fd1f5a57b Mon Sep 17 00:00:00 2001 From: Martin Hoffmann Date: Thu, 10 Nov 2016 11:53:28 +0100 Subject: [PATCH 1/2] Introduce a new trait for event receivers that want markers. --- parser/src/parser.rs | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/parser/src/parser.rs b/parser/src/parser.rs index 3a64045..2b7d441 100644 --- a/parser/src/parser.rs +++ b/parser/src/parser.rs @@ -74,14 +74,24 @@ pub struct Parser { anchor_id: usize, } + pub trait EventReceiver { fn on_event(&mut self, ev: &Event); +} - fn on_event_with_marker(&mut self, ev: &Event, _mark: Marker) { + +pub trait MarkedEventReceiver { + fn on_event(&mut self, ev: &Event, _mark: Marker); +} + +impl MarkedEventReceiver for R { + fn on_event(&mut self, ev: &Event, _mark: Marker) { self.on_event(ev) } } + + pub type ParseResult = Result<(Event, Marker), ScanError>; impl> Parser { @@ -126,18 +136,18 @@ impl> Parser { self.states.push(state); } - fn parse(&mut self, recv: &mut R) + fn parse(&mut self, recv: &mut R) -> Result { if self.state == State::End { return Ok(Event::StreamEnd); } let (ev, mark) = try!(self.state_machine()); // println!("EV {:?}", ev); - recv.on_event_with_marker(&ev, mark); + recv.on_event(&ev, mark); Ok(ev) } - pub fn load(&mut self, recv: &mut R, multi: bool) + pub fn load(&mut self, recv: &mut R, multi: bool) -> Result<(), ScanError> { if !self.scanner.stream_started() { let ev = try!(self.parse(recv)); @@ -146,13 +156,13 @@ impl> Parser { if self.scanner.stream_ended() { // XXX has parsed? - recv.on_event_with_marker(&Event::StreamEnd, self.scanner.mark()); + recv.on_event(&Event::StreamEnd, self.scanner.mark()); return Ok(()); } loop { let ev = try!(self.parse(recv)); if ev == Event::StreamEnd { - recv.on_event_with_marker(&Event::StreamEnd, self.scanner.mark()); + recv.on_event(&Event::StreamEnd, self.scanner.mark()); return Ok(()); } // clear anchors before a new document @@ -165,7 +175,7 @@ impl> Parser { Ok(()) } - fn load_document(&mut self, first_ev: &Event, recv: &mut R) + fn load_document(&mut self, first_ev: &Event, recv: &mut R) -> Result<(), ScanError> { assert_eq!(first_ev, &Event::DocumentStart); @@ -179,7 +189,7 @@ impl> Parser { Ok(()) } - fn load_node(&mut self, first_ev: &Event, recv: &mut R) + fn load_node(&mut self, first_ev: &Event, recv: &mut R) -> Result<(), ScanError> { match *first_ev { Event::Alias(..) | Event::Scalar(..) => { @@ -196,7 +206,7 @@ impl> Parser { } } - fn load_mapping(&mut self, _first_ev: &Event, recv: &mut R) + fn load_mapping(&mut self, _first_ev: &Event, recv: &mut R) -> Result<(), ScanError> { let mut ev = try!(self.parse(recv)); while ev != Event::MappingEnd { @@ -213,7 +223,7 @@ impl> Parser { Ok(()) } - fn load_sequence(&mut self, _first_ev: &Event, recv: &mut R) + fn load_sequence(&mut self, _first_ev: &Event, recv: &mut R) -> Result<(), ScanError> { let mut ev = try!(self.parse(recv)); while ev != Event::SequenceEnd { From e09485ea92d6acf28cea8f643405a300896f0eb1 Mon Sep 17 00:00:00 2001 From: Martin Hoffmann Date: Fri, 11 Nov 2016 11:53:31 +0100 Subject: [PATCH 2/2] Make YamlLoader implement MarkedEventReceiver. --- parser/src/yaml.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parser/src/yaml.rs b/parser/src/yaml.rs index 6d0417c..d9f63d4 100644 --- a/parser/src/yaml.rs +++ b/parser/src/yaml.rs @@ -6,7 +6,7 @@ use std::str::FromStr; use std::mem; use std::vec; use parser::*; -use scanner::{TScalarStyle, ScanError, TokenType}; +use scanner::{TScalarStyle, ScanError, TokenType, Marker}; /// A YAML node is stored as this `Yaml` enumeration, which provides an easy way to /// access your YAML document. @@ -74,8 +74,8 @@ pub struct YamlLoader { anchor_map: BTreeMap, } -impl EventReceiver for YamlLoader { - fn on_event(&mut self, ev: &Event) { +impl MarkedEventReceiver for YamlLoader { + fn on_event(&mut self, ev: &Event, _: Marker) { // println!("EV {:?}", ev); match *ev { Event::DocumentStart => {