proto_types/timestamp/
timestamp_conversions.rs

1#[cfg(feature = "chrono")]
2mod chrono {
3  use std::convert::{From, TryFrom};
4
5  use chrono::{DateTime, FixedOffset, Utc};
6
7  use crate::{timestamp::TimestampError, Timestamp};
8  impl From<DateTime<Utc>> for Timestamp {
9    fn from(datetime: DateTime<Utc>) -> Self {
10      let mut ts = Timestamp {
11        seconds: datetime.timestamp(),
12        // Safe casting as this value is limited by chrono
13        nanos: datetime.timestamp_subsec_nanos() as i32,
14      };
15      ts.normalize();
16      ts
17    }
18  }
19
20  impl TryFrom<Timestamp> for DateTime<Utc> {
21    type Error = TimestampError;
22
23    fn try_from(mut timestamp: Timestamp) -> Result<Self, Self::Error> {
24      timestamp.normalize();
25
26      DateTime::<Utc>::from_timestamp(timestamp.seconds, timestamp.nanos as u32)
27        .ok_or(TimestampError::OutOfSystemRange(timestamp))
28    }
29  }
30
31  impl TryFrom<Timestamp> for DateTime<FixedOffset> {
32    type Error = TimestampError;
33
34    fn try_from(mut timestamp: Timestamp) -> Result<Self, Self::Error> {
35      timestamp.normalize();
36
37      let chrono_utc: DateTime<Utc> = timestamp.try_into()?;
38
39      Ok(chrono_utc.into())
40    }
41  }
42}
43
44#[cfg(feature = "totokens")]
45mod totokens {
46  use proc_macro2::TokenStream;
47  use quote::{quote, ToTokens};
48
49  use crate::Timestamp;
50
51  impl ToTokens for Timestamp {
52    fn to_tokens(&self, tokens: &mut TokenStream) {
53      let seconds = self.seconds;
54      let nanos = self.nanos;
55
56      tokens.extend(quote! {
57        ::protocheck::types::Timestamp {
58          seconds: #seconds,
59          nanos: #nanos,
60        }
61      });
62    }
63  }
64}