diff options
| author | Edward Barnard | 2015-12-22 12:44:33 +0000 |
|---|---|---|
| committer | Edward Barnard | 2015-12-22 12:44:33 +0000 |
| commit | e257aaef791ba83dc7cbdde358180c9394017459 (patch) | |
| tree | 3d59c46d77b268729ab1f677470bc52bcce6ae8e /src | |
| parent | 2f9201a4f6a75b4c348ef63e37573f3c964908f0 (diff) | |
| download | rust-plist-e257aaef791ba83dc7cbdde358180c9394017459.tar.bz2 | |
EventReader lazy initialization
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 30 |
1 files changed, 21 insertions, 9 deletions
@@ -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 |
