Always pass events by value

- The EventReceiver gets ownership of events
- Breaks compatilibility with previous interface
This commit is contained in:
Christian Hofer 2017-06-19 15:41:26 +02:00
parent f94a1deabe
commit 505b1d6ec1
3 changed files with 23 additions and 34 deletions

View file

@ -76,31 +76,20 @@ pub struct Parser<T> {
pub trait EventReceiver { pub trait EventReceiver {
fn on_event(&mut self, ev: &Event); fn on_event(&mut self, ev: Event);
} }
pub trait MarkedEventReceiver { pub trait MarkedEventReceiver {
fn on_event(&mut self, ev: &Event, _mark: Marker); fn on_event(&mut self, ev: Event, _mark: Marker);
} }
impl<R: EventReceiver> MarkedEventReceiver for R { impl<R: EventReceiver> MarkedEventReceiver for R {
fn on_event(&mut self, ev: &Event, _mark: Marker) { fn on_event(&mut self, ev: Event, _mark: Marker) {
self.on_event(ev) self.on_event(ev)
} }
} }
pub trait MarkedOwnedEventReceiver {
fn on_owned_event(&mut self, ev: Event, _mark: Marker);
}
impl<R: MarkedEventReceiver> MarkedOwnedEventReceiver for R {
fn on_owned_event(&mut self, ev: Event, _mark: Marker) {
self.on_event(&ev, _mark);
}
}
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> {
@ -145,7 +134,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
self.states.push(state); self.states.push(state);
} }
fn parse(&mut self) -> Result<(Event, Marker), ScanError> { fn parse(&mut self) -> ParseResult {
if self.state == State::End { if self.state == State::End {
return Ok((Event::StreamEnd, self.scanner.mark())); return Ok((Event::StreamEnd, self.scanner.mark()));
} }
@ -154,23 +143,23 @@ impl<T: Iterator<Item=char>> Parser<T> {
Ok((ev, mark)) Ok((ev, mark))
} }
pub fn load<R: MarkedOwnedEventReceiver>(&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, mark) = try!(self.parse()); let (ev, mark) = try!(self.parse());
assert_eq!(ev, Event::StreamStart); assert_eq!(ev, Event::StreamStart);
recv.on_owned_event(ev, mark); recv.on_event(ev, mark);
} }
if self.scanner.stream_ended() { if self.scanner.stream_ended() {
// XXX has parsed? // XXX has parsed?
recv.on_owned_event(Event::StreamEnd, self.scanner.mark()); recv.on_event(Event::StreamEnd, self.scanner.mark());
return Ok(()); return Ok(());
} }
loop { loop {
let (ev, mark) = try!(self.parse()); let (ev, mark) = try!(self.parse());
if ev == Event::StreamEnd { if ev == Event::StreamEnd {
recv.on_owned_event(ev, mark); recv.on_event(ev, mark);
return Ok(()); return Ok(());
} }
// clear anchors before a new document // clear anchors before a new document
@ -183,10 +172,10 @@ impl<T: Iterator<Item=char>> Parser<T> {
Ok(()) Ok(())
} }
fn load_document<R: MarkedOwnedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R) fn load_document<R: MarkedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
assert_eq!(first_ev, Event::DocumentStart); assert_eq!(first_ev, Event::DocumentStart);
recv.on_owned_event(first_ev, mark); recv.on_event(first_ev, mark);
let (ev, mark) = try!(self.parse()); let (ev, mark) = try!(self.parse());
try!(self.load_node(ev, mark, recv)); try!(self.load_node(ev, mark, recv));
@ -194,24 +183,24 @@ impl<T: Iterator<Item=char>> Parser<T> {
// DOCUMENT-END is expected. // DOCUMENT-END is expected.
let (ev, mark) = try!(self.parse()); let (ev, mark) = try!(self.parse());
assert_eq!(ev, Event::DocumentEnd); assert_eq!(ev, Event::DocumentEnd);
recv.on_owned_event(ev, mark); recv.on_event(ev, mark);
Ok(()) Ok(())
} }
fn load_node<R: MarkedOwnedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R) fn load_node<R: MarkedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
match first_ev { match first_ev {
Event::Alias(..) | Event::Scalar(..) => { Event::Alias(..) | Event::Scalar(..) => {
recv.on_owned_event(first_ev, mark); recv.on_event(first_ev, mark);
Ok(()) Ok(())
}, },
Event::SequenceStart(_) => { Event::SequenceStart(_) => {
recv.on_owned_event(first_ev, mark); recv.on_event(first_ev, mark);
self.load_sequence(recv) self.load_sequence(recv)
}, },
Event::MappingStart(_) => { Event::MappingStart(_) => {
recv.on_owned_event(first_ev, mark); recv.on_event(first_ev, mark);
self.load_mapping(recv) self.load_mapping(recv)
}, },
_ => { println!("UNREACHABLE EVENT: {:?}", first_ev); _ => { println!("UNREACHABLE EVENT: {:?}", first_ev);
@ -219,7 +208,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
} }
} }
fn load_mapping<R: MarkedOwnedEventReceiver>(&mut self, recv: &mut R) fn load_mapping<R: MarkedEventReceiver>(&mut self, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
let (mut key_ev, mut key_mark) = try!(self.parse()); let (mut key_ev, mut key_mark) = try!(self.parse());
while key_ev != Event::MappingEnd { while key_ev != Event::MappingEnd {
@ -236,11 +225,11 @@ impl<T: Iterator<Item=char>> Parser<T> {
key_mark = mark; key_mark = mark;
} }
recv.on_owned_event(key_ev, key_mark); recv.on_event(key_ev, key_mark);
Ok(()) Ok(())
} }
fn load_sequence<R: MarkedOwnedEventReceiver>(&mut self, recv: &mut R) fn load_sequence<R: MarkedEventReceiver>(&mut self, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
let (mut ev, mut mark) = try!(self.parse()); let (mut ev, mut mark) = try!(self.parse());
while ev != Event::SequenceEnd { while ev != Event::SequenceEnd {
@ -251,7 +240,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
ev = next_ev; ev = next_ev;
mark = next_mark; mark = next_mark;
} }
recv.on_owned_event(ev, mark); recv.on_event(ev, mark);
Ok(()) Ok(())
} }

View file

@ -75,8 +75,8 @@ pub struct YamlLoader {
anchor_map: BTreeMap<usize, Yaml>, anchor_map: BTreeMap<usize, Yaml>,
} }
impl MarkedOwnedEventReceiver for YamlLoader { impl MarkedEventReceiver for YamlLoader {
fn on_owned_event(&mut self, ev: Event, _: Marker) { fn on_event(&mut self, ev: Event, _: Marker) {
// println!("EV {:?}", ev); // println!("EV {:?}", ev);
match ev { match ev {
Event::DocumentStart => { Event::DocumentStart => {

View file

@ -25,8 +25,8 @@ struct YamlChecker {
} }
impl EventReceiver for YamlChecker { impl EventReceiver for YamlChecker {
fn on_event(&mut self, ev: &Event) { fn on_event(&mut self, ev: Event) {
let tev = match *ev { let tev = match ev {
Event::DocumentStart => TestEvent::OnDocumentStart, Event::DocumentStart => TestEvent::OnDocumentStart,
Event::DocumentEnd => TestEvent::OnDocumentEnd, Event::DocumentEnd => TestEvent::OnDocumentEnd,
Event::SequenceStart(..) => TestEvent::OnSequenceStart, Event::SequenceStart(..) => TestEvent::OnSequenceStart,