From e257aaef791ba83dc7cbdde358180c9394017459 Mon Sep 17 00:00:00 2001 From: Edward Barnard Date: Tue, 22 Dec 2015 12:44:33 +0000 Subject: EventReader lazy initialization --- src/lib.rs | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'src') 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 for ReadError { } pub enum EventReader { + Uninitialized(Option), Xml(xml::EventReader), Binary(binary::EventReader) } impl EventReader { - pub fn new(mut reader: R) -> EventReader { - 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 { + EventReader::Uninitialized(Some(reader)) } fn is_binary(reader: &mut R) -> Result { @@ -159,9 +157,23 @@ impl Iterator for EventReader { type Item = ReadResult; fn next(&mut self) -> Option> { - 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 -- cgit v1.2.3