summaryrefslogtreecommitdiffstats
path: root/lib/src/types/datetime.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-12-08 17:50:29 +0100
committerMatthias Beyer <mail@beyermatthias.de>2021-12-08 18:44:24 +0100
commit7ae0325d7e54df8db88bc7bc757c3cb674a0fb0f (patch)
treed5aed5f5c9681c954f6756550ca219d48b1dee1a /lib/src/types/datetime.rs
parent82add278cc59329345c49554539922926635ee70 (diff)
Split codebase in subcrates for lib, cli and gui
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'lib/src/types/datetime.rs')
-rw-r--r--lib/src/types/datetime.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/src/types/datetime.rs b/lib/src/types/datetime.rs
new file mode 100644
index 0000000..00d739a
--- /dev/null
+++ b/lib/src/types/datetime.rs
@@ -0,0 +1,35 @@
+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)
+ }
+}
+