obrewin_data_structures/
misc.rs1use chrono::{DateTime, Utc};
2use serde::de::Error as DeError;
3use serde::{Deserialize, Serialize};
4
5#[derive(Copy, Clone)]
7pub struct DateTimeUTC(DateTime<Utc>);
8
9impl From<DateTime<Utc>> for DateTimeUTC {
10 fn from(value: DateTime<Utc>) -> Self {
11 Self(value)
12 }
13}
14
15impl From<DateTimeUTC> for DateTime<Utc> {
16 fn from(value: DateTimeUTC) -> Self {
17 value.0
18 }
19}
20
21impl Serialize for DateTimeUTC {
22 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
23 where
24 S: serde::Serializer,
25 {
26 let (total_seconds, subsec_nano) = (self.0.timestamp(), self.0.timestamp_subsec_nanos());
27 (total_seconds, subsec_nano).serialize(serializer)
28 }
29}
30
31impl<'de> Deserialize<'de> for DateTimeUTC {
32 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
33 where
34 D: serde::Deserializer<'de>,
35 {
36 let (sec, subsec_nano): (i64, u32) = Deserialize::deserialize(deserializer)?;
37 if let Some(dt) = chrono::DateTime::from_timestamp(sec, subsec_nano) {
38 Ok(dt.into())
39 } else {
40 Err(DeError::custom("DateTimeUTC deserialization failed"))
41 }
42 }
43}