aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binary/reader.rs24
-rw-r--r--src/xml/reader.rs14
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
}
}
}