ploidy_util/
date_time.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(
5    Clone, Copy, Debug, Deserialize, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
6)]
7#[serde(transparent)]
8pub struct UnixMicroseconds(#[serde(with = "chrono::serde::ts_microseconds")] DateTime<Utc>);
9
10impl From<DateTime<Utc>> for UnixMicroseconds {
11    #[inline]
12    fn from(value: DateTime<Utc>) -> Self {
13        Self(value)
14    }
15}
16
17impl From<UnixMicroseconds> for DateTime<Utc> {
18    #[inline]
19    fn from(value: UnixMicroseconds) -> Self {
20        value.0
21    }
22}
23
24impl TryFrom<i64> for UnixMicroseconds {
25    type Error = TryFromTimestampError;
26
27    #[inline]
28    fn try_from(value: i64) -> Result<Self, Self::Error> {
29        Ok(Self(
30            DateTime::from_timestamp_micros(value).ok_or(TryFromTimestampError)?,
31        ))
32    }
33}
34
35#[derive(
36    Clone, Copy, Debug, Deserialize, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
37)]
38#[serde(transparent)]
39pub struct UnixMilliseconds(#[serde(with = "chrono::serde::ts_milliseconds")] DateTime<Utc>);
40
41impl From<DateTime<Utc>> for UnixMilliseconds {
42    #[inline]
43    fn from(value: DateTime<Utc>) -> Self {
44        Self(value)
45    }
46}
47
48impl From<UnixMilliseconds> for DateTime<Utc> {
49    #[inline]
50    fn from(value: UnixMilliseconds) -> Self {
51        value.0
52    }
53}
54
55impl TryFrom<i64> for UnixMilliseconds {
56    type Error = TryFromTimestampError;
57
58    #[inline]
59    fn try_from(value: i64) -> Result<Self, Self::Error> {
60        Ok(Self(
61            DateTime::from_timestamp_millis(value).ok_or(TryFromTimestampError)?,
62        ))
63    }
64}
65
66#[derive(
67    Clone, Copy, Debug, Deserialize, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
68)]
69#[serde(transparent)]
70pub struct UnixNanoseconds(#[serde(with = "chrono::serde::ts_nanoseconds")] DateTime<Utc>);
71
72impl From<DateTime<Utc>> for UnixNanoseconds {
73    #[inline]
74    fn from(value: DateTime<Utc>) -> Self {
75        Self(value)
76    }
77}
78
79impl From<UnixNanoseconds> for DateTime<Utc> {
80    #[inline]
81    fn from(value: UnixNanoseconds) -> Self {
82        value.0
83    }
84}
85
86impl From<i64> for UnixNanoseconds {
87    #[inline]
88    fn from(value: i64) -> Self {
89        Self(DateTime::from_timestamp_nanos(value))
90    }
91}
92
93#[derive(
94    Clone, Copy, Debug, Deserialize, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
95)]
96#[serde(transparent)]
97pub struct UnixSeconds(#[serde(with = "chrono::serde::ts_seconds")] DateTime<Utc>);
98
99impl From<DateTime<Utc>> for UnixSeconds {
100    #[inline]
101    fn from(value: DateTime<Utc>) -> Self {
102        Self(value)
103    }
104}
105
106impl From<UnixSeconds> for DateTime<Utc> {
107    #[inline]
108    fn from(value: UnixSeconds) -> Self {
109        value.0
110    }
111}
112
113impl TryFrom<i64> for UnixSeconds {
114    type Error = TryFromTimestampError;
115
116    #[inline]
117    fn try_from(value: i64) -> Result<Self, Self::Error> {
118        Ok(Self(
119            DateTime::from_timestamp_secs(value).ok_or(TryFromTimestampError)?,
120        ))
121    }
122}
123
124#[derive(Debug, thiserror::Error)]
125#[error("timestamp out of range for `DateTime<Utc>`")]
126pub struct TryFromTimestampError;