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;