aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorEdward Barnard2015-08-28 18:58:38 +0700
committerEdward Barnard2015-08-28 18:58:38 +0700
commitb5ad734bd68454fcb304a555bd2b1f0bb3274ec9 (patch)
tree1a49349cb59211402d15d4e2335faca2a4385dae /src/lib.rs
parent0c2ad6b0d12524b7042d45a92c1b20d8082c662c (diff)
downloadrust-plist-b5ad734bd68454fcb304a555bd2b1f0bb3274ec9.tar.bz2
Add StartPlist and EndPlist events
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 6168295..8de9efa 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -26,6 +26,9 @@ pub enum Plist {
#[derive(Debug, PartialEq)]
pub enum PlistEvent {
+ StartPlist,
+ EndPlist,
+
StartArray(Option<u64>),
EndArray,
@@ -153,10 +156,15 @@ impl<T:Iterator<Item=PlistEvent>> Builder<T> {
pub fn build(mut self) -> BuilderResult<Plist> {
self.bump();
+ if let Some(PlistEvent::StartPlist) = self.token {
+ self.bump();
+ }
+
let plist = try!(self.build_value());
self.bump();
match self.token {
None => (),
+ Some(PlistEvent::EndPlist) => self.bump(),
// The stream should have finished
_ => return Err(BuilderError::InvalidEvent)
};
@@ -169,6 +177,9 @@ impl<T:Iterator<Item=PlistEvent>> Builder<T> {
fn build_value(&mut self) -> BuilderResult<Plist> {
match self.token.take() {
+ Some(PlistEvent::StartPlist) => Err(BuilderError::InvalidEvent),
+ Some(PlistEvent::EndPlist) => Err(BuilderError::InvalidEvent),
+
Some(PlistEvent::StartArray(len)) => Ok(Plist::Array(try!(self.build_array(len)))),
Some(PlistEvent::StartDictionary(len)) => Ok(Plist::Dictionary(try!(self.build_dict(len)))),
@@ -240,6 +251,7 @@ mod tests {
// Input
let events = vec![
+ StartPlist,
StartDictionary(None),
StringValue("Author".to_owned()),
StringValue("William Shakespeare".to_owned()),
@@ -252,7 +264,8 @@ mod tests {
IntegerValue(1564),
StringValue("Height".to_owned()),
RealValue(1.60),
- EndDictionary
+ EndDictionary,
+ EndPlist,
];
let builder = Builder::from_event_stream(events.into_iter());