From 0ec05856dab205db2a874dc45340f8b522bd7634 Mon Sep 17 00:00:00 2001 From: Edward Barnard Date: Fri, 25 Dec 2015 20:45:06 +0000 Subject: Kill StartPlist and EndPlist --- src/xml/reader.rs | 10 +++--- src/xml/writer.rs | 97 ++++++++++++++++++++++++------------------------------- 2 files changed, 47 insertions(+), 60 deletions(-) (limited to 'src/xml') diff --git a/src/xml/reader.rs b/src/xml/reader.rs index e32dd4a..9f57ab4 100644 --- a/src/xml/reader.rs +++ b/src/xml/reader.rs @@ -60,7 +60,7 @@ impl EventReader { self.element_stack.push(name.local_name.clone()); match &name.local_name[..] { - "plist" => return Some(Ok(PlistEvent::StartPlist)), + "plist" => (), "array" => return Some(Ok(PlistEvent::StartArray(None))), "dict" => return Some(Ok(PlistEvent::StartDictionary(None))), "key" => return Some(self.read_content(|s| Ok(PlistEvent::StringValue(s)))), @@ -114,7 +114,7 @@ impl EventReader { match &name.local_name[..] { "array" => return Some(Ok(PlistEvent::EndArray)), "dict" => return Some(Ok(PlistEvent::EndDictionary)), - "plist" => return Some(Ok(PlistEvent::EndPlist)), + "plist" => (), _ => (), } } @@ -170,8 +170,7 @@ mod tests { let streaming_parser = EventReader::new(reader); let events: Vec = streaming_parser.map(|e| e.unwrap()).collect(); - let comparison = &[StartPlist, - StartDictionary(None), + let comparison = &[StartDictionary(None), StringValue("Author".to_owned()), StringValue("William Shakespeare".to_owned()), StringValue("Lines".to_owned()), @@ -189,8 +188,7 @@ mod tests { DateValue(UTC.ymd(1981, 05, 16).and_hms(11, 32, 06)), StringValue("Blank".to_owned()), StringValue("".to_owned()), - EndDictionary, - EndPlist]; + EndDictionary]; assert_eq!(events, comparison); } diff --git a/src/xml/writer.rs b/src/xml/writer.rs index 633181b..148d9ad 100644 --- a/src/xml/writer.rs +++ b/src/xml/writer.rs @@ -74,6 +74,17 @@ impl EventWriter { Ok(()) } + fn maybe_end_plist(&mut self) -> Result<()> { + // If there are no more open tags then write the element + if self.stack.len() == 1 { + try!(self.end_element("plist")); + if let Some(Element::Root) = self.stack.pop() {} else { + return Err(Error::InvalidData); + } + } + Ok(()) + } + pub fn write(&mut self, event: &PlistEvent) -> Result<()> { ::write(self, event) } @@ -88,7 +99,11 @@ impl EventWriterTrait for EventWriter { try!(self.write_element_and_value("key", &*value)); self.stack.push(Element::Dictionary(DictionaryState::ExpectValue)); } - PlistEvent::EndDictionary => try!(self.end_element("dict")), + PlistEvent::EndDictionary => { + try!(self.end_element("dict")); + // We might be closing the last tag here as well + try!(self.maybe_end_plist()); + } _ => return Err(Error::InvalidData), }; return Ok(()); @@ -98,39 +113,20 @@ impl EventWriterTrait for EventWriter { } Some(other) => self.stack.push(other), None => { - match *event { - PlistEvent::StartPlist => { - let version_name = Name::local("version"); - let version_attr = Attribute::new(version_name, "1.0"); - - let result = self.xml_writer.write(WriteXmlEvent::StartElement { - name: Name::local("plist"), - attributes: Cow::Borrowed(&[version_attr]), - namespace: Cow::Borrowed(&self.empty_namespace), - }); - - match result { - Ok(()) => (), - Err(_) => return Err(Error::InvalidData), - } - - self.stack.push(Element::Root); - return Ok(()); - } - _ => return Err(Error::InvalidData), - } - } - } + let version_name = Name::local("version"); + let version_attr = Attribute::new(version_name, "1.0"); - Ok(match *event { - PlistEvent::StartPlist => return Err(Error::InvalidData), - PlistEvent::EndPlist => { - try!(self.end_element("plist")); - if let Some(Element::Root) = self.stack.pop() {} else { - return Err(Error::InvalidData); - } + try!(self.xml_writer.write(WriteXmlEvent::StartElement { + name: Name::local("plist"), + attributes: Cow::Borrowed(&[version_attr]), + namespace: Cow::Borrowed(&self.empty_namespace), + })); + + self.stack.push(Element::Root); } + } + match *event { PlistEvent::StartArray(_) => { try!(self.start_element("array")); self.stack.push(Element::Array); @@ -173,7 +169,11 @@ impl EventWriterTrait for EventWriter { PlistEvent::StringValue(ref value) => { try!(self.write_element_and_value("string", &*value)) } - }) + }; + + try!(self.maybe_end_plist()); + + Ok(()) } } @@ -188,8 +188,7 @@ mod tests { fn streaming_parser() { use PlistEvent::*; - let plist = &[StartPlist, - StartDictionary(None), + let plist = &[StartDictionary(None), StringValue("Author".to_owned()), StringValue("William Shakespeare".to_owned()), StringValue("Lines".to_owned()), @@ -205,8 +204,7 @@ mod tests { DataValue(vec![0, 0, 0, 190, 0, 0, 0, 3, 0, 0, 0, 30, 0, 0, 0]), StringValue("Birthdate".to_owned()), DateValue(UTC.ymd(1981, 05, 16).and_hms(11, 32, 06)), - EndDictionary, - EndPlist]; + EndDictionary]; let mut cursor = Cursor::new(Vec::new()); @@ -220,36 +218,27 @@ mod tests { let comparison = " - \ - + Author - William \ - Shakespeare + William Shakespeare Lines - \ - It is a tale told by an idiot, - \ - Full of sound and fury, signifying nothing. - \ - + It is a tale told by an idiot, + Full of sound and fury, signifying nothing. + Death 1564 - \ - Height + Height 1.6 Data - \ - AAAAvgAAAAMAAAAeAAAA + AAAAvgAAAAMAAAAeAAAA Birthdate - \ - 1981-05-16T11:32:06+00:00 + 1981-05-16T11:32:06+00:00 "; - let s = String::from_utf8(cursor.into_inner()).unwrap(); - assert_eq!(&s, comparison); + assert_eq!(s, comparison); } } -- cgit v1.2.3