Skip to main content

bma_ts/
impl_chrono.rs

1use std::time::Duration;
2
3use super::{Error, Timestamp};
4use chrono::{DateTime, Local, NaiveDateTime, Utc};
5
6impl TryFrom<Timestamp> for NaiveDateTime {
7    type Error = Error;
8    #[inline]
9    fn try_from(t: Timestamp) -> Result<Self, Self::Error> {
10        let d = DateTime::from_timestamp(i64::try_from(t.0.as_secs())?, t.0.subsec_nanos())
11            .ok_or(Error::ConvertChrono)?;
12        Ok(d.naive_utc())
13    }
14}
15impl TryFrom<Timestamp> for DateTime<Utc> {
16    type Error = Error;
17    fn try_from(t: Timestamp) -> Result<Self, Self::Error> {
18        let nt = NaiveDateTime::try_from(t)?;
19        let dt_utc = DateTime::<Utc>::from_naive_utc_and_offset(nt, Utc);
20        Ok(dt_utc)
21    }
22}
23impl TryFrom<Timestamp> for DateTime<Local> {
24    type Error = Error;
25    fn try_from(t: Timestamp) -> Result<Self, Self::Error> {
26        let dt_utc = DateTime::<Utc>::try_from(t)?;
27        Ok(DateTime::from(dt_utc))
28    }
29}
30impl TryFrom<NaiveDateTime> for Timestamp {
31    type Error = Error;
32    fn try_from(datetime: NaiveDateTime) -> Result<Self, Self::Error> {
33        let duration_nanos = Duration::from_secs(u64::try_from(
34            datetime
35                .and_utc()
36                .timestamp_nanos_opt()
37                .ok_or(Error::ConvertChrono)?,
38        )?);
39        Ok(Self(duration_nanos))
40    }
41}
42impl TryFrom<DateTime<Utc>> for Timestamp {
43    type Error = Error;
44    fn try_from(datetime: DateTime<Utc>) -> Result<Self, Self::Error> {
45        let duration_sec = Duration::from_secs(u64::try_from(datetime.timestamp())?);
46        let duration_nanos = Duration::from_nanos(u64::from(datetime.timestamp_subsec_nanos()));
47        Ok(Self(duration_sec + duration_nanos))
48    }
49}
50impl TryFrom<DateTime<Local>> for Timestamp {
51    type Error = Error;
52    fn try_from(datetime: DateTime<Local>) -> Result<Self, Self::Error> {
53        let duration_sec = Duration::from_secs(u64::try_from(datetime.timestamp())?);
54        let duration_nanos = Duration::from_nanos(u64::from(datetime.timestamp_subsec_nanos()));
55        Ok(Self(duration_sec + duration_nanos))
56    }
57}
58impl Timestamp {
59    #[inline]
60    pub fn try_into_naivedatetime(self) -> Result<NaiveDateTime, Error> {
61        self.try_into()
62    }
63    #[inline]
64    pub fn try_into_datetime_local(self) -> Result<DateTime<Local>, Error> {
65        self.try_into()
66    }
67    #[inline]
68    pub fn try_into_datetime_utc(self) -> Result<DateTime<Utc>, Error> {
69        self.try_into()
70    }
71}