aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEdward Barnard2015-12-22 12:44:33 +0000
committerEdward Barnard2015-12-22 12:44:33 +0000
commite257aaef791ba83dc7cbdde358180c9394017459 (patch)
tree3d59c46d77b268729ab1f677470bc52bcce6ae8e /src
parent2f9201a4f6a75b4c348ef63e37573f3c964908f0 (diff)
downloadrust-plist-e257aaef791ba83dc7cbdde358180c9394017459.tar.bz2
EventReader lazy initialization
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 59524ae..ca3aa3e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -129,16 +129,14 @@ impl From<ChronoParseError> for ReadError {
}
pub enum EventReader<R: Read+Seek> {
+ Uninitialized(Option<R>),
Xml(xml::EventReader<R>),
Binary(binary::EventReader<R>)
}
impl<R: Read+Seek> EventReader<R> {
- pub fn new(mut reader: R) -> EventReader<R> {
- match EventReader::is_binary(&mut reader) {
- Ok(true) => EventReader::Binary(binary::EventReader::new(reader)),
- Ok(false) | Err(_) => EventReader::Xml(xml::EventReader::new(reader))
- }
+ pub fn new(reader: R) -> EventReader<R> {
+ EventReader::Uninitialized(Some(reader))
}
fn is_binary(reader: &mut R) -> Result<bool, IoError> {
@@ -159,9 +157,23 @@ impl<R: Read+Seek> Iterator for EventReader<R> {
type Item = ReadResult<PlistEvent>;
fn next(&mut self) -> Option<ReadResult<PlistEvent>> {
- match *self {
- EventReader::Xml(ref mut parser) => parser.next(),
- EventReader::Binary(ref mut parser) => parser.next()
- }
+ let mut reader = match *self {
+ EventReader::Xml(ref mut parser) => return parser.next(),
+ EventReader::Binary(ref mut parser) => return parser.next(),
+ EventReader::Uninitialized(ref mut reader) => reader.take().unwrap()
+ };
+
+ let event_reader = match EventReader::is_binary(&mut reader) {
+ Ok(true) => EventReader::Binary(binary::EventReader::new(reader)),
+ Ok(false) => EventReader::Xml(xml::EventReader::new(reader)),
+ Err(err) => {
+ ::std::mem::replace(self, EventReader::Uninitialized(Some(reader)));
+ return Some(Err(ReadError::Io(err)))
+ }
+ };
+
+ ::std::mem::replace(self, event_reader);
+
+ self.next()
}
} \ No newline at end of file