Merge pull request #43 from partim/marked-event-receiver

Introduce a new trait for event receivers that want markers.
This commit is contained in:
Chen Yuheng 2016-11-14 10:43:23 +08:00 committed by GitHub
commit 8350ad4996
2 changed files with 23 additions and 13 deletions

View file

@ -74,14 +74,24 @@ pub struct Parser<T> {
anchor_id: usize, anchor_id: usize,
} }
pub trait EventReceiver { pub trait EventReceiver {
fn on_event(&mut self, ev: &Event); 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<R: EventReceiver> MarkedEventReceiver for R {
fn on_event(&mut self, ev: &Event, _mark: Marker) {
self.on_event(ev) self.on_event(ev)
} }
} }
pub type ParseResult = Result<(Event, Marker), ScanError>; pub type ParseResult = Result<(Event, Marker), ScanError>;
impl<T: Iterator<Item=char>> Parser<T> { impl<T: Iterator<Item=char>> Parser<T> {
@ -126,18 +136,18 @@ impl<T: Iterator<Item=char>> Parser<T> {
self.states.push(state); self.states.push(state);
} }
fn parse<R: EventReceiver>(&mut self, recv: &mut R) fn parse<R: MarkedEventReceiver>(&mut self, recv: &mut R)
-> Result<Event, ScanError> { -> Result<Event, ScanError> {
if self.state == State::End { if self.state == State::End {
return Ok(Event::StreamEnd); return Ok(Event::StreamEnd);
} }
let (ev, mark) = try!(self.state_machine()); let (ev, mark) = try!(self.state_machine());
// println!("EV {:?}", ev); // println!("EV {:?}", ev);
recv.on_event_with_marker(&ev, mark); recv.on_event(&ev, mark);
Ok(ev) Ok(ev)
} }
pub fn load<R: EventReceiver>(&mut self, recv: &mut R, multi: bool) pub fn load<R: MarkedEventReceiver>(&mut self, recv: &mut R, multi: bool)
-> Result<(), ScanError> { -> Result<(), ScanError> {
if !self.scanner.stream_started() { if !self.scanner.stream_started() {
let ev = try!(self.parse(recv)); let ev = try!(self.parse(recv));
@ -146,13 +156,13 @@ impl<T: Iterator<Item=char>> Parser<T> {
if self.scanner.stream_ended() { if self.scanner.stream_ended() {
// XXX has parsed? // XXX has parsed?
recv.on_event_with_marker(&Event::StreamEnd, self.scanner.mark()); recv.on_event(&Event::StreamEnd, self.scanner.mark());
return Ok(()); return Ok(());
} }
loop { loop {
let ev = try!(self.parse(recv)); let ev = try!(self.parse(recv));
if ev == Event::StreamEnd { if ev == Event::StreamEnd {
recv.on_event_with_marker(&Event::StreamEnd, self.scanner.mark()); recv.on_event(&Event::StreamEnd, self.scanner.mark());
return Ok(()); return Ok(());
} }
// clear anchors before a new document // clear anchors before a new document
@ -165,7 +175,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
Ok(()) Ok(())
} }
fn load_document<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R) fn load_document<R: MarkedEventReceiver>(&mut self, first_ev: &Event, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
assert_eq!(first_ev, &Event::DocumentStart); assert_eq!(first_ev, &Event::DocumentStart);
@ -179,7 +189,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
Ok(()) Ok(())
} }
fn load_node<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R) fn load_node<R: MarkedEventReceiver>(&mut self, first_ev: &Event, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
match *first_ev { match *first_ev {
Event::Alias(..) | Event::Scalar(..) => { Event::Alias(..) | Event::Scalar(..) => {
@ -196,7 +206,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
} }
} }
fn load_mapping<R: EventReceiver>(&mut self, _first_ev: &Event, recv: &mut R) fn load_mapping<R: MarkedEventReceiver>(&mut self, _first_ev: &Event, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
let mut ev = try!(self.parse(recv)); let mut ev = try!(self.parse(recv));
while ev != Event::MappingEnd { while ev != Event::MappingEnd {
@ -213,7 +223,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
Ok(()) Ok(())
} }
fn load_sequence<R: EventReceiver>(&mut self, _first_ev: &Event, recv: &mut R) fn load_sequence<R: MarkedEventReceiver>(&mut self, _first_ev: &Event, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
let mut ev = try!(self.parse(recv)); let mut ev = try!(self.parse(recv));
while ev != Event::SequenceEnd { while ev != Event::SequenceEnd {

View file

@ -6,7 +6,7 @@ use std::str::FromStr;
use std::mem; use std::mem;
use std::vec; use std::vec;
use parser::*; 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 /// A YAML node is stored as this `Yaml` enumeration, which provides an easy way to
/// access your YAML document. /// access your YAML document.
@ -74,8 +74,8 @@ pub struct YamlLoader {
anchor_map: BTreeMap<usize, Yaml>, anchor_map: BTreeMap<usize, Yaml>,
} }
impl EventReceiver for YamlLoader { impl MarkedEventReceiver for YamlLoader {
fn on_event(&mut self, ev: &Event) { fn on_event(&mut self, ev: &Event, _: Marker) {
// println!("EV {:?}", ev); // println!("EV {:?}", ev);
match *ev { match *ev {
Event::DocumentStart => { Event::DocumentStart => {