Merge pull request #43 from partim/marked-event-receiver
Introduce a new trait for event receivers that want markers.
This commit is contained in:
commit
8350ad4996
2 changed files with 23 additions and 13 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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 => {
|
||||||
|
|
Loading…
Reference in a new issue