summaryrefslogtreecommitdiffstats
path: root/lib/src/types/datetime.rs
blob: 70098d731b565cdeb157641ac7b8bb35b14970b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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)
    }
}

impl DateTime {
    pub fn inner(&self) -> &chrono::DateTime<chrono::Utc> {
        &self.0
    }
}