From bad63f4d227c65245c43d747e37f02c5d0265f03 Mon Sep 17 00:00:00 2001 From: Edward Barnard Date: Wed, 23 Sep 2015 20:21:16 +0100 Subject: Handle blank strings --- src/xml/reader.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src/xml/reader.rs') diff --git a/src/xml/reader.rs b/src/xml/reader.rs index 329c180..091775e 100644 --- a/src/xml/reader.rs +++ b/src/xml/reader.rs @@ -9,6 +9,7 @@ use super::super::{ParserError, ParserResult, PlistEvent}; pub struct StreamingParser { xml_reader: EventReader, + queued_event: Option, element_stack: Vec, finished: bool } @@ -25,6 +26,7 @@ impl StreamingParser { StreamingParser { xml_reader: EventReader::with_config(reader, config), + queued_event: None, element_stack: Vec::new(), finished: false } @@ -33,13 +35,25 @@ impl StreamingParser { fn read_content(&mut self, f: F) -> ParserResult where F:FnOnce(String) -> ParserResult { match self.xml_reader.next() { XmlEvent::Characters(s) => f(s), + event @ XmlEvent::EndElement{..} => { + self.queued_event = Some(event); + f("".to_owned()) + }, _ => Err(ParserError::InvalidData) } } - fn next_event(&mut self) -> Option> { + fn next_event(&mut self) -> XmlEvent { + if let Some(event) = self.queued_event.take() { + event + } else { + self.xml_reader.next() + } + } + + fn next_inner(&mut self) -> Option> { loop { - match self.xml_reader.next() { + match self.next_event() { XmlEvent::StartElement { name, .. } => { // Add the current element to the element stack self.element_stack.push(name.local_name.clone()); @@ -113,7 +127,7 @@ impl Iterator for StreamingParser { if self.finished { None } else { - match self.next_event() { + match self.next_inner() { None => { self.finished = true; None @@ -163,6 +177,8 @@ mod tests { DataValue(vec![0, 0, 0, 190, 0, 0, 0, 3, 0, 0, 0, 30, 0, 0, 0]), StringValue("Birthdate".to_owned()), DateValue(UTC.ymd(1981, 05, 16).and_hms(11, 32, 06)), + StringValue("Blank".to_owned()), + StringValue("".to_owned()), EndDictionary, EndPlist ]; -- cgit v1.2.3