aboutsummaryrefslogtreecommitdiffstats
path: root/src/xml.rs
diff options
context:
space:
mode:
authorEdward Barnard2015-08-11 11:40:49 +0100
committerEdward Barnard2015-08-11 11:40:49 +0100
commit7fad4d1b24faee94ca5313d5411ae292f46846ff (patch)
tree3561e537c89686c10d749631e3fde0fccf9b32ce /src/xml.rs
parente1889668d9e077392d9172691d7530c7b2de5abf (diff)
downloadrust-plist-7fad4d1b24faee94ca5313d5411ae292f46846ff.tar.bz2
Improved errors
Diffstat (limited to 'src/xml.rs')
-rw-r--r--src/xml.rs23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/xml.rs b/src/xml.rs
index cb2a339..a15db70 100644
--- a/src/xml.rs
+++ b/src/xml.rs
@@ -4,7 +4,7 @@ use std::str::FromStr;
use xml_rs::reader::{EventReader, ParserConfig};
use xml_rs::reader::events::XmlEvent;
-use super::PlistEvent;
+use super::{ParserError, PlistEvent};
pub struct StreamingParser<R: Read> {
xml_reader: EventReader<R>,
@@ -30,7 +30,7 @@ impl<R: Read> StreamingParser<R> {
fn read_content<F>(&mut self, f: F) -> PlistEvent where F:FnOnce(String) -> PlistEvent {
match self.xml_reader.next() {
XmlEvent::Characters(s) => f(s),
- _ => PlistEvent::Error(())
+ _ => PlistEvent::Error(ParserError::InvalidData)
}
}
}
@@ -55,32 +55,32 @@ impl<R: Read> Iterator for StreamingParser<R> {
"data" => return Some(self.read_content(|s| {
match FromBase64::from_base64(&s[..]) {
Ok(b) => PlistEvent::DataValue(b),
- Err(_) => PlistEvent::Error(())
+ Err(_) => PlistEvent::Error(ParserError::InvalidData)
}
})),
"date" => return Some(self.read_content(|s| PlistEvent::DateValue(s))),
"integer" => return Some(self.read_content(|s| {
match FromStr::from_str(&s) {
Ok(i) => PlistEvent::IntegerValue(i),
- Err(_) => PlistEvent::Error(())
+ Err(_) => PlistEvent::Error(ParserError::InvalidData)
}
})),
"real" => return Some(self.read_content(|s| {
match FromStr::from_str(&s) {
Ok(f) => PlistEvent::RealValue(f),
- Err(_) => PlistEvent::Error(())
+ Err(_) => PlistEvent::Error(ParserError::InvalidData)
}
})),
"string" => return Some(self.read_content(|s| PlistEvent::StringValue(s))),
- _ => return Some(PlistEvent::Error(()))
+ _ => return Some(PlistEvent::Error(ParserError::InvalidData))
}
},
XmlEvent::EndElement { name, .. } => {
// Check the corrent element is being closed
match self.element_stack.pop() {
Some(ref open_name) if &name.local_name == open_name => (),
- Some(ref open_name) => return Some(PlistEvent::Error(())),
- None => return Some(PlistEvent::Error(()))
+ Some(ref open_name) => return Some(PlistEvent::Error(ParserError::InvalidData)),
+ None => return Some(PlistEvent::Error(ParserError::InvalidData))
}
match &name.local_name[..] {
@@ -89,7 +89,12 @@ impl<R: Read> Iterator for StreamingParser<R> {
_ => ()
}
},
- XmlEvent::EndDocument => return None,
+ XmlEvent::EndDocument => {
+ match self.element_stack.is_empty() {
+ true => return None,
+ false => return Some(PlistEvent::Error(ParserError::UnexpectedEof))
+ }
+ }
_ => ()
}
}