1use core::fmt;
2use std::time::Duration;
3
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5
6use crate::{Monotonic, Timestamp};
7
8#[cfg(not(feature = "as-float-secs"))]
9impl Serialize for Timestamp {
10 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11 where
12 S: Serializer,
13 {
14 serializer.serialize_u64(self.as_nanos().try_into().unwrap())
15 }
16}
17
18#[cfg(feature = "as-float-secs")]
19impl Serialize for Timestamp {
20 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
21 where
22 S: Serializer,
23 {
24 serializer.serialize_f64(self.as_secs_f64())
25 }
26}
27
28impl Serialize for Monotonic {
29 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30 where
31 S: Serializer,
32 {
33 serializer.serialize_u64(self.as_nanos().try_into().unwrap())
34 }
35}
36
37struct TimestampVisitor;
38
39impl<'de> serde::de::Visitor<'de> for TimestampVisitor {
40 type Value = Timestamp;
41
42 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
43 formatter.write_str("a string, float, an unsigned integer, or a 2-element array")
44 }
45
46 #[cfg(not(feature = "as-float-secs"))]
47 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
48 where
49 E: serde::de::Error,
50 {
51 Ok(value.into())
52 }
53
54 #[cfg(feature = "as-float-secs")]
55 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
56 where
57 E: serde::de::Error,
58 {
59 Ok(Timestamp::from_secs(value))
60 }
61
62 fn visit_f32<E>(self, value: f32) -> Result<Self::Value, E>
63 where
64 E: serde::de::Error,
65 {
66 Ok(value.into())
67 }
68
69 fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E>
70 where
71 E: serde::de::Error,
72 {
73 Ok(value.into())
74 }
75
76 fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
77 where
78 V: serde::de::SeqAccess<'de>,
79 {
80 let s: u64 = seq
81 .next_element()?
82 .ok_or_else(|| serde::de::Error::invalid_length(0, &self))?;
83 let ns: u32 = seq
84 .next_element()?
85 .ok_or_else(|| serde::de::Error::invalid_length(1, &self))?;
86 Ok(Duration::new(s, ns).into())
87 }
88 fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
89 where
90 E: serde::de::Error,
91 {
92 value
93 .parse()
94 .map_err(|_| serde::de::Error::custom("invalid time string"))
95 }
96 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
97 where
98 E: serde::de::Error,
99 {
100 value
101 .parse()
102 .map_err(|_| serde::de::Error::custom("invalid time string"))
103 }
104}
105
106impl<'de> Deserialize<'de> for Timestamp {
107 fn deserialize<D>(deserializer: D) -> Result<Timestamp, D::Error>
108 where
109 D: Deserializer<'de>,
110 {
111 deserializer.deserialize_any(TimestampVisitor)
112 }
113}
114
115struct MonotonicVisitor;
116
117impl<'de> serde::de::Visitor<'de> for MonotonicVisitor {
118 type Value = Monotonic;
119
120 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
121 formatter.write_str("a string, float, an unsigned integer, or a 2-element array")
122 }
123
124 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
125 where
126 E: serde::de::Error,
127 {
128 Ok(value.into())
129 }
130
131 fn visit_f32<E>(self, value: f32) -> Result<Self::Value, E>
132 where
133 E: serde::de::Error,
134 {
135 Ok(value.into())
136 }
137
138 fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E>
139 where
140 E: serde::de::Error,
141 {
142 Ok(value.into())
143 }
144
145 fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
146 where
147 V: serde::de::SeqAccess<'de>,
148 {
149 let s: u64 = seq
150 .next_element()?
151 .ok_or_else(|| serde::de::Error::invalid_length(0, &self))?;
152 let ns: u32 = seq
153 .next_element()?
154 .ok_or_else(|| serde::de::Error::invalid_length(1, &self))?;
155 Ok(Duration::new(s, ns).into())
156 }
157 fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
158 where
159 E: serde::de::Error,
160 {
161 value
162 .parse()
163 .map_err(|_| serde::de::Error::custom("invalid time string"))
164 }
165
166 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
167 where
168 E: serde::de::Error,
169 {
170 value
171 .parse()
172 .map_err(|_| serde::de::Error::custom("invalid time string"))
173 }
174}
175
176impl<'de> Deserialize<'de> for Monotonic {
177 fn deserialize<D>(deserializer: D) -> Result<Monotonic, D::Error>
178 where
179 D: Deserializer<'de>,
180 {
181 deserializer.deserialize_any(MonotonicVisitor)
182 }
183}