aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEdward Barnard2018-10-06 22:04:58 +0100
committerEdward Barnard2018-10-06 23:18:22 +0100
commitf063fb69d3b8e801bcb594b8882a6e45961e3d46 (patch)
treeca10d9e4c7a45da50ae1dce73b364bd54e0dc92c /src
parent69182ce8d32a62667f1f71806ebfbe864fc0d58a (diff)
downloadrust-plist-f063fb69d3b8e801bcb594b8882a6e45961e3d46.tar.bz2
Add convenience methods for Value and serialisation.
Diffstat (limited to 'src')
-rw-r--r--src/de.rs19
-rw-r--r--src/lib.rs10
-rw-r--r--src/value.rs35
3 files changed, 52 insertions, 12 deletions
diff --git a/src/de.rs b/src/de.rs
index 173bc7b..2a5c26e 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -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)
+}
diff --git a/src/lib.rs b/src/lib.rs
index 451d7c3..47722c9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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