proto_types/timestamp/
timestamp_conversions.rs

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