From d02734fb6d030c028e186ceb5508367c5ab84f7f Mon Sep 17 00:00:00 2001 From: Edward Barnard Date: Sat, 26 Sep 2015 15:45:23 +0100 Subject: Fuse xml reader on error --- src/binary/reader.rs | 24 ++++++++++++++++++------ src/xml/reader.rs | 14 +++++++------- 2 files changed, 25 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/binary/reader.rs b/src/binary/reader.rs index 75c7535..837f216 100644 --- a/src/binary/reader.rs +++ b/src/binary/reader.rs @@ -38,7 +38,8 @@ pub struct StreamingParser { stack: Vec, object_offsets: Vec, reader: R, - ref_size: u8 + ref_size: u8, + finished: bool } impl StreamingParser { @@ -47,7 +48,8 @@ impl StreamingParser { stack: Vec::new(), object_offsets: Vec::new(), reader: reader, - ref_size: 0 + ref_size: 0, + finished: false } } @@ -262,10 +264,20 @@ impl Iterator for StreamingParser { type Item = ParserResult; fn next(&mut self) -> Option> { - match self.read_next() { - Ok(Some(result)) => Some(Ok(result)), - Err(err) => Some(Err(err)), - Ok(None) => None + if self.finished { + None + } else { + match self.read_next() { + Ok(Some(event)) => Some(Ok(event)), + Err(err) => { + self.finished = true; + Some(Err(err)) + }, + Ok(None) => { + self.finished = true; + None + } + } } } } diff --git a/src/xml/reader.rs b/src/xml/reader.rs index 091775e..b372e8e 100644 --- a/src/xml/reader.rs +++ b/src/xml/reader.rs @@ -51,7 +51,7 @@ impl StreamingParser { } } - fn next_inner(&mut self) -> Option> { + fn read_next(&mut self) -> Option> { loop { match self.next_event() { XmlEvent::StartElement { name, .. } => { @@ -127,16 +127,16 @@ impl Iterator for StreamingParser { if self.finished { None } else { - match self.next_inner() { - None => { + match self.read_next() { + Some(Ok(event)) => Some(Ok(event)), + Some(Err(err)) => { self.finished = true; - None + Some(Err(err)) }, - ret @ Some(Err(_)) => { + None => { self.finished = true; - ret + None } - ret => ret } } } -- cgit v1.2.3