proto_types/timestamp/
timestamp_conversions.rs1use 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}