diff options
| author | Edward Barnard | 2015-09-26 15:45:23 +0100 |
|---|---|---|
| committer | Edward Barnard | 2015-09-26 15:45:23 +0100 |
| commit | d02734fb6d030c028e186ceb5508367c5ab84f7f (patch) | |
| tree | 92978e1793356e83d3d2706df9040b36e5db0773 | |
| parent | 3964f2a14cba647f6e69d70b3c3cf57a2527e5a5 (diff) | |
| download | rust-plist-d02734fb6d030c028e186ceb5508367c5ab84f7f.tar.bz2 | |
Fuse xml reader on error
| -rw-r--r-- | src/binary/reader.rs | 24 | ||||
| -rw-r--r-- | src/xml/reader.rs | 14 |
2 files changed, 25 insertions, 13 deletions
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<R> { stack: Vec<StackItem>, object_offsets: Vec<u64>, reader: R, - ref_size: u8 + ref_size: u8, + finished: bool } impl<R: Read+Seek> StreamingParser<R> { @@ -47,7 +48,8 @@ impl<R: Read+Seek> StreamingParser<R> { stack: Vec::new(), object_offsets: Vec::new(), reader: reader, - ref_size: 0 + ref_size: 0, + finished: false } } @@ -262,10 +264,20 @@ impl<R: Read+Seek> Iterator for StreamingParser<R> { type Item = ParserResult<PlistEvent>; fn next(&mut self) -> Option<ParserResult<PlistEvent>> { - 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<R: Read> StreamingParser<R> { } } - fn next_inner(&mut self) -> Option<ParserResult<PlistEvent>> { + fn read_next(&mut self) -> Option<ParserResult<PlistEvent>> { loop { match self.next_event() { XmlEvent::StartElement { name, .. } => { @@ -127,16 +127,16 @@ impl<R: Read> Iterator for StreamingParser<R> { 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 } } } |
