diff options
| author | Edward Barnard | 2018-10-06 22:04:58 +0100 |
|---|---|---|
| committer | Edward Barnard | 2018-10-06 23:18:22 +0100 |
| commit | f063fb69d3b8e801bcb594b8882a6e45961e3d46 (patch) | |
| tree | ca10d9e4c7a45da50ae1dce73b364bd54e0dc92c /src | |
| parent | 69182ce8d32a62667f1f71806ebfbe864fc0d58a (diff) | |
| download | rust-plist-f063fb69d3b8e801bcb594b8882a6e45961e3d46.tar.bz2 | |
Add convenience methods for Value and serialisation.
Diffstat (limited to 'src')
| -rw-r--r-- | src/de.rs | 19 | ||||
| -rw-r--r-- | src/lib.rs | 10 | ||||
| -rw-r--r-- | src/value.rs | 35 |
3 files changed, 52 insertions, 12 deletions
@@ -1,7 +1,9 @@ use serde::de; use std::fmt::Display; -use std::io::{Read, Seek}; +use std::fs::File; +use std::io::{BufReader, Read, Seek}; use std::iter::Peekable; +use std::path::Path; use events::{self, Event}; use {u64_to_usize, Error}; @@ -387,9 +389,22 @@ where } } -/// Deserializes an instance of type `T` from a seekable byte stream. +/// Deserializes an instance of type `T` from a plist file of any encoding. +pub fn from_file<P: AsRef<Path>, T: de::DeserializeOwned>(path: P) -> Result<T, Error> { + let file = File::open(path)?; + from_reader(BufReader::new(file)) +} + +/// Deserializes an instance of type `T` from a seekable byte stream containing a plist file of any encoding. pub fn from_reader<R: Read + Seek, T: de::DeserializeOwned>(reader: R) -> Result<T, Error> { let reader = events::Reader::new(reader); let mut de = Deserializer::new(reader); de::Deserialize::deserialize(&mut de) } + +/// Deserializes an instance of type `T` from a byte stream containing an XML encoded plist file. +pub fn from_reader_xml<R: Read, T: de::DeserializeOwned>(reader: R) -> Result<T, Error> { + let reader = events::XmlReader::new(reader); + let mut de = Deserializer::new(reader); + de::Deserialize::deserialize(&mut de) +} @@ -23,8 +23,7 @@ //! use plist::Value; //! use std::fs::File; //! -//! let file = File::open("tests/data/xml.plist").unwrap(); -//! let value = Value::from_reader(file).unwrap(); +//! let value = Value::from_file("tests/data/xml.plist").unwrap(); //! //! match value { //! Value::Array(_array) => (), @@ -40,8 +39,6 @@ //! //! # #[cfg(feature = "serde")] //! # fn main() { -//! use std::fs::File; -//! //! #[derive(Deserialize)] //! #[serde(rename_all = "PascalCase")] //! struct Info { @@ -49,8 +46,7 @@ //! height: f32, //! } //! -//! let file = File::open("tests/data/xml.plist").unwrap(); -//! let info: Info = plist::from_reader(file).unwrap(); +//! let info: Info = plist::from_file("tests/data/xml.plist").unwrap(); //! # } //! # //! # #[cfg(not(feature = "serde"))] @@ -79,7 +75,7 @@ mod de; #[cfg(feature = "serde")] mod ser; #[cfg(feature = "serde")] -pub use self::de::{from_reader, Deserializer}; +pub use self::de::{from_file, from_reader, from_reader_xml, Deserializer}; #[cfg(feature = "serde")] pub use self::ser::{to_writer_xml, Serializer}; diff --git a/src/value.rs b/src/value.rs index 59cc3d3..d594077 100644 --- a/src/value.rs +++ b/src/value.rs @@ -1,7 +1,10 @@ use std::collections::BTreeMap; -use std::io::{Read, Seek}; +use std::fs::File; +use std::io::Write; +use std::io::{BufReader, Read, Seek}; +use std::path::Path; -use events::{Event, Reader}; +use events::{Event, Reader, Writer, XmlReader, XmlWriter}; use {u64_to_usize, Date, Error}; /// Represents any plist value. @@ -18,12 +21,38 @@ pub enum Value { } impl Value { - /// Reads a `Value` from a seekable byte stream. + /// Reads a `Value` from a plist file of any encoding. + pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Value, Error> { + let file = File::open(path)?; + Value::from_reader(BufReader::new(file)) + } + + /// Reads a `Value` from a seekable byte stream containing a plist file of any encoding. pub fn from_reader<R: Read + Seek>(reader: R) -> Result<Value, Error> { let reader = Reader::new(reader); Value::from_events(reader) } + /// Reads a `Value` from a seekable byte stream containing an XML encoded plist file. + pub fn from_reader_xml<R: Read>(reader: R) -> Result<Value, Error> { + let reader = XmlReader::new(reader); + Value::from_events(reader) + } + + /// Serializes the given data structure as an XML encoded plist file. + pub fn to_writer_xml<W: Write>(&self, writer: W) -> Result<(), Error> { + let mut writer = XmlWriter::new(writer); + self.to_writer_xml_inner(&mut writer) + } + + fn to_writer_xml_inner(&self, writer: &mut Writer) -> Result<(), Error> { + let events = self.clone().into_events(); + for event in events { + writer.write(&event)?; + } + Ok(()) + } + /// Creates a `Value` from an event source. pub fn from_events<T>(events: T) -> Result<Value, Error> where |
