diff options
| author | Edward Barnard | 2017-05-03 13:20:02 +0100 |
|---|---|---|
| committer | Edward Barnard | 2017-05-03 13:20:02 +0100 |
| commit | 29248dcf3e8e1798b09967583fffed95a8856380 (patch) | |
| tree | 09bcdf8a9154e1457f83ace3b3c24703bb40b7e8 /src/date.rs | |
| parent | 9ac3cd9e720ed9e412361c51c5611f24b1518402 (diff) | |
| download | rust-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.rs | 59 |
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) + } + } +} |
