diff options
| author | Edward Barnard | 2018-02-27 10:22:42 +0000 |
|---|---|---|
| committer | Edward Barnard | 2018-02-27 10:33:54 +0000 |
| commit | c91087906540c210bdb457b32fb976ce735b22f9 (patch) | |
| tree | 1968d9710404fc8386f68c56f705d5d02774bbbb | |
| parent | 3ad6b78c4583b9ea8a801cd963d569eecbae144b (diff) | |
| download | rust-plist-c91087906540c210bdb457b32fb976ce735b22f9.tar.bz2 | |
Stop exposing internal functions and chrono types in Date.
| -rw-r--r-- | src/binary/reader.rs | 2 | ||||
| -rw-r--r-- | src/date.rs | 48 | ||||
| -rw-r--r-- | src/plist.rs | 11 | ||||
| -rw-r--r-- | src/serde/de.rs | 2 | ||||
| -rw-r--r-- | src/serde/ser.rs | 3 | ||||
| -rw-r--r-- | src/xml/reader.rs | 4 | ||||
| -rw-r--r-- | src/xml/writer.rs | 5 | ||||
| -rw-r--r-- | tests/serde_tests/mod.rs | 4 |
8 files changed, 38 insertions, 41 deletions
diff --git a/src/binary/reader.rs b/src/binary/reader.rs index f63f127..bf21864 100644 --- a/src/binary/reader.rs +++ b/src/binary/reader.rs @@ -346,7 +346,7 @@ mod tests { StringValue("Height".to_owned()), RealValue(1.60), StringValue("Birthdate".to_owned()), - DateValue(Utc.ymd(1981, 05, 16).and_hms(11, 32, 06).into()), + DateValue(Date::from_chrono(Utc.ymd(1981, 05, 16).and_hms(11, 32, 06))), StringValue("Author".to_owned()), StringValue("William Shakespeare".to_owned()), StringValue("Data".to_owned()), diff --git a/src/date.rs b/src/date.rs index 4091f28..bb1a887 100644 --- a/src/date.rs +++ b/src/date.rs @@ -1,6 +1,5 @@ use chrono::{DateTime, Duration, TimeZone, Utc}; -use std::fmt; -use std::str::FromStr; +use std::time::SystemTime; use {Error, Result}; @@ -11,8 +10,18 @@ pub struct Date { } impl Date { - #[doc(hidden)] - pub fn from_seconds_since_plist_epoch(timestamp: f64) -> Result<Date> { + pub(crate) fn from_rfc3339(date: &str) -> Result<Self> { + let date = DateTime::parse_from_rfc3339(date).map_err(|_| Error::InvalidData)?; + Ok(Date { + inner: date.with_timezone(&Utc), + }) + } + + pub(crate) fn to_rfc3339(&self) -> String { + format!("{:?}", self.inner) + } + + pub(crate) fn from_seconds_since_plist_epoch(timestamp: f64) -> Result<Date> { // Seconds since 1/1/2001 00:00:00. if timestamp.is_nan() { @@ -37,32 +46,22 @@ impl Date { Ok(Date { inner: date }) } -} -impl From<DateTime<Utc>> for Date { - fn from(date: DateTime<Utc>) -> Self { + #[cfg(test)] + pub(crate) fn from_chrono(date: DateTime<Utc>) -> Date { Date { inner: date } } } -impl Into<DateTime<Utc>> for Date { - fn into(self) -> DateTime<Utc> { - self.inner +impl From<SystemTime> for Date { + fn from(date: SystemTime) -> Self { + Date { inner: date.into() } } } -impl fmt::Display for Date { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self.inner) - } -} - -impl FromStr for Date { - type Err = (); - - fn from_str(s: &str) -> ::std::result::Result<Self, Self::Err> { - let date = DateTime::parse_from_rfc3339(s).map_err(|_| ())?; - Ok(Date { inner: date.with_timezone(&Utc) }) +impl Into<SystemTime> for Date { + fn into(self) -> SystemTime { + self.inner.into() } } @@ -71,7 +70,6 @@ pub 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; @@ -81,7 +79,7 @@ pub mod serde_impls { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer { - let date_str = self.to_string(); + let date_str = self.to_rfc3339(); serializer.serialize_newtype_struct(DATE_NEWTYPE_STRUCT_NAME, &date_str) } } @@ -114,7 +112,7 @@ pub mod serde_impls { 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)) + Date::from_rfc3339(v).map_err(|_| E::invalid_value(Unexpected::Str(v), &self)) } } diff --git a/src/plist.rs b/src/plist.rs index 27df833..9fbfe5a 100644 --- a/src/plist.rs +++ b/src/plist.rs @@ -334,14 +334,13 @@ impl<'a> From<&'a str> for Plist { #[cfg(test)] mod tests { - use super::Plist; + use std::collections::BTreeMap; + use std::time::SystemTime; + + use {Date, Plist}; #[test] fn test_plist_access() { - use std::collections::BTreeMap; - use chrono::prelude::*; - use super::Date; - let vec = vec![Plist::Real(0.0)]; let mut array = Plist::Array(vec.clone()); assert_eq!(array.as_array(), Some(&vec.clone())); @@ -360,7 +359,7 @@ mod tests { assert_eq!(Plist::Data(slice.to_vec()).into_data(), Some(slice.to_vec())); - let date: Date = Utc::now().into(); + let date: Date = SystemTime::now().into(); assert_eq!(Plist::Date(date.clone()).as_date(), Some(&date)); assert_eq!(Plist::Real(0.0).as_real(), Some(0.0)); diff --git a/src/serde/de.rs b/src/serde/de.rs index 87ccc64..a33b480 100644 --- a/src/serde/de.rs +++ b/src/serde/de.rs @@ -82,7 +82,7 @@ impl<'de, 'a, I> de::Deserializer<'de> for &'a mut Deserializer<I> PlistEvent::BooleanValue(v) => visitor.visit_bool(v), PlistEvent::DataValue(v) => visitor.visit_byte_buf(v), - PlistEvent::DateValue(v) => visitor.visit_string(v.to_string()), + PlistEvent::DateValue(v) => visitor.visit_string(v.to_rfc3339()), PlistEvent::IntegerValue(v) if v.is_positive() => visitor.visit_u64(v as u64), PlistEvent::IntegerValue(v) => visitor.visit_i64(v as i64), PlistEvent::RealValue(v) => visitor.visit_f64(v), diff --git a/src/serde/ser.rs b/src/serde/ser.rs index 692bba0..5e04d2e 100644 --- a/src/serde/ser.rs +++ b/src/serde/ser.rs @@ -1,6 +1,5 @@ use serde_base::ser; use std::fmt::Display; -use std::str::FromStr; use {Date, Error, EventWriter, PlistEvent}; use date::serde_impls::DATE_NEWTYPE_STRUCT_NAME; @@ -455,7 +454,7 @@ impl<'a, W: EventWriter> ser::Serializer for DateSerializer<'a, W> { } fn serialize_str(self, v: &str) -> Result<(), Self::Error> { - let date = Date::from_str(v).map_err(|_| self.expecting_date_error())?; + let date = Date::from_rfc3339(v).map_err(|_| self.expecting_date_error())?; self.ser.emit(PlistEvent::DateValue(date)) } diff --git a/src/xml/reader.rs b/src/xml/reader.rs index e6b6953..66fd8f1 100644 --- a/src/xml/reader.rs +++ b/src/xml/reader.rs @@ -72,7 +72,7 @@ impl<R: Read> EventReader<R> { } "date" => { return Some(self.read_content(|s| { - Ok(PlistEvent::DateValue(Date::from_str(&s).map_err(|_| Error::InvalidData)?)) + Ok(PlistEvent::DateValue(Date::from_rfc3339(&s)?)) })) } "integer" => { @@ -176,7 +176,7 @@ mod tests { StringValue("Data".to_owned()), 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).into()), + DateValue(Date::from_chrono(Utc.ymd(1981, 05, 16).and_hms(11, 32, 06))), StringValue("Blank".to_owned()), StringValue("".to_owned()), EndDictionary]; diff --git a/src/xml/writer.rs b/src/xml/writer.rs index 7048b32..ffb8aa4 100644 --- a/src/xml/writer.rs +++ b/src/xml/writer.rs @@ -166,7 +166,7 @@ impl<W: Write> PlistEventWriter for EventWriter<W> { self.write_element_and_value("data", &base64_data)?; } PlistEvent::DateValue(ref value) => { - self.write_element_and_value("date", &value.to_string())? + self.write_element_and_value("date", &value.to_rfc3339())? } PlistEvent::IntegerValue(ref value) => { self.write_element_and_value("integer", &value.to_string())? @@ -190,6 +190,7 @@ mod tests { use chrono::{TimeZone, Utc}; use std::io::Cursor; + use Date; use super::*; #[test] @@ -211,7 +212,7 @@ mod tests { StringValue("Data".to_owned()), 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).into()), + DateValue(Date::from_chrono(Utc.ymd(1981, 05, 16).and_hms(11, 32, 06))), EndDictionary]; let mut cursor = Cursor::new(Vec::new()); diff --git a/tests/serde_tests/mod.rs b/tests/serde_tests/mod.rs index 0793a98..d8583a2 100644 --- a/tests/serde_tests/mod.rs +++ b/tests/serde_tests/mod.rs @@ -1,10 +1,10 @@ -use chrono::{TimeZone, Utc}; use plist::{Date, EventWriter, PlistEvent, Result as PlistResult}; use plist::serde::{Serializer, Deserializer}; use plist::PlistEvent::*; use serde::de::DeserializeOwned; use serde::ser::Serialize; use std::fmt::Debug; +use std::time::SystemTime; struct VecWriter { events: Vec<PlistEvent>, @@ -247,7 +247,7 @@ struct TypeWithDate { #[test] fn type_with_date() { - let date: Date = Utc.ymd(1981, 05, 16).and_hms(11, 32, 06).into(); + let date: Date = SystemTime::now().into(); let obj = TypeWithDate { a: Some(28), |
