bma_ts/
impl_serde.rs

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}