aboutsummaryrefslogtreecommitdiffstats
path: root/src/date.rs
diff options
context:
space:
mode:
authorEdward Barnard2017-05-03 13:20:02 +0100
committerEdward Barnard2017-05-03 13:20:02 +0100
commit29248dcf3e8e1798b09967583fffed95a8856380 (patch)
tree09bcdf8a9154e1457f83ace3b3c24703bb40b7e8 /src/date.rs
parent9ac3cd9e720ed9e412361c51c5611f24b1518402 (diff)
downloadrust-plist-0.2.0.tar.bz2
Implement serialisation and deserialisation for the plist Date type.v0.2.0
Diffstat (limited to 'src/date.rs')
-rw-r--r--src/date.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/date.rs b/src/date.rs
index 2bcf9da..1aa0e72 100644
--- a/src/date.rs
+++ b/src/date.rs
@@ -65,3 +65,62 @@ impl FromStr for Date {
})
}
}
+
+#[cfg(feature = "serde")]
+mod serde_impls {
+ use serde_base::de::{Deserialize, Deserializer, Error, Visitor, Unexpected};
+ use serde_base::ser::{Serialize, Serializer};
+ use std::fmt;
+ use std::str::FromStr;
+
+ use Date;
+
+ impl Serialize for Date {
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ where S: Serializer,
+ {
+ let date_str = self.to_string();
+ serializer.serialize_newtype_struct("PLIST-DATE", &date_str)
+ }
+ }
+
+ struct DateNewtypeVisitor;
+
+ impl<'de> Visitor<'de> for DateNewtypeVisitor {
+ type Value = Date;
+
+ fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ formatter.write_str("a plist date newtype")
+ }
+
+ fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
+ where D: Deserializer<'de>,
+ {
+ deserializer.deserialize_str(DateStrVisitor)
+ }
+ }
+
+ struct DateStrVisitor;
+
+ impl<'de> Visitor<'de> for DateStrVisitor {
+ type Value = Date;
+
+ fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ formatter.write_str("a plist date string")
+ }
+
+ fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
+ where E: Error,
+ {
+ Date::from_str(v).map_err(|_| E::invalid_value(Unexpected::Str(v), &self))
+ }
+ }
+
+ impl<'de> Deserialize<'de> for Date {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where D: Deserializer<'de>,
+ {
+ deserializer.deserialize_newtype_struct("PLIST-DATE", DateNewtypeVisitor)
+ }
+ }
+}