diff options
Diffstat (limited to 'src/types/datetime.rs')
-rw-r--r-- | src/types/datetime.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/types/datetime.rs b/src/types/datetime.rs index 6735731..00d739a 100644 --- a/src/types/datetime.rs +++ b/src/types/datetime.rs @@ -1,9 +1,32 @@ +use std::convert::TryFrom; use anyhow::Error; +use anyhow::Result; #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(transparent)] pub struct DateTime(chrono::DateTime<chrono::Utc>); +impl Into<ipfs::Ipld> for DateTime { + fn into(self) -> ipfs::Ipld { + ipfs::Ipld::String(self.0.to_rfc3339()) + } +} + +impl TryFrom<ipfs::Ipld> for DateTime { + type Error = Error; + + fn try_from(ipld: ipfs::Ipld) -> Result<DateTime> { + match ipld { + ipfs::Ipld::String(s) => chrono::DateTime::parse_from_rfc3339(&s) + .map(|dt| dt.with_timezone(&chrono::Utc)) + .map(DateTime) + .map_err(Error::from), + _ => anyhow::bail!("Expected string for timestamp"), + } + } +} + + impl From<chrono::DateTime<chrono::Utc>> for DateTime { fn from(dt: chrono::DateTime<chrono::Utc>) -> Self { DateTime(dt) |