proto_types/timestamp/
timestamp_conversions.rs1#[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 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}