serde_nanos/
de.rs

1use std::fmt;
2use std::marker::PhantomData;
3
4#[cfg(feature = "chrono")]
5use chrono;
6
7use serde::de::{Error, SeqAccess, Visitor};
8use serde::Deserializer;
9
10/// Types that can be deserialized via `#[serde(with = "serde_nanos")]`.
11pub trait Deserialize<'de>: Sized {
12    #[allow(missing_docs)]
13    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
14    where
15        D: Deserializer<'de>;
16}
17
18impl<'de> Deserialize<'de> for std::time::Duration {
19    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20    where
21        D: Deserializer<'de>,
22    {
23        serde::Deserialize::deserialize(deserializer)
24            .map(|nanos| std::time::Duration::from_nanos(nanos))
25    }
26}
27
28impl<'de> Deserialize<'de> for Option<std::time::Duration> {
29    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30    where
31        D: Deserializer<'de>,
32    {
33        struct OptionVisitor<T> {
34            marker: PhantomData<T>,
35        }
36
37        impl<'de, T: Deserialize<'de>> Visitor<'de> for OptionVisitor<T> {
38            type Value = Option<T>;
39
40            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
41                formatter.write_str("option")
42            }
43
44            #[inline]
45            fn visit_unit<E>(self) -> Result<Option<T>, E>
46            where
47                E: Error,
48            {
49                Ok(None)
50            }
51
52            #[inline]
53            fn visit_none<E>(self) -> Result<Option<T>, E>
54            where
55                E: Error,
56            {
57                Ok(None)
58            }
59
60            #[inline]
61            fn visit_some<D>(self, deserializer: D) -> Result<Option<T>, D::Error>
62            where
63                D: Deserializer<'de>,
64            {
65                T::deserialize(deserializer).map(Some)
66            }
67        }
68
69        deserializer.deserialize_option(OptionVisitor {
70            marker: PhantomData,
71        })
72    }
73}
74
75impl<'de> Deserialize<'de> for Vec<std::time::Duration> {
76    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
77    where
78        D: Deserializer<'de>,
79    {
80        struct VecVisitor {
81            marker: PhantomData<Vec<std::time::Duration>>,
82        }
83        impl<'de> Visitor<'de> for VecVisitor {
84            type Value = Vec<std::time::Duration>;
85
86            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
87                formatter.write_str("array of durations in nanoseconds")
88            }
89
90            fn visit_seq<S>(self, mut visitor: S) -> Result<Self::Value, S::Error>
91            where
92                S: SeqAccess<'de>,
93            {
94                let mut durations = Vec::with_capacity(visitor.size_hint().unwrap_or(0));
95                while let Some(elem) = visitor.next_element()? {
96                    durations.push(std::time::Duration::from_nanos(elem));
97                }
98                Ok(durations)
99            }
100        }
101        deserializer.deserialize_seq(VecVisitor {
102            marker: PhantomData,
103        })
104    }
105}
106
107#[cfg(feature = "chrono")]
108impl<'de> Deserialize<'de> for chrono::Duration {
109    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
110    where
111        D: Deserializer<'de>,
112    {
113        serde::Deserialize::deserialize(deserializer)
114            .map(|nanos| chrono::Duration::nanoseconds(nanos))
115    }
116}
117
118#[cfg(feature = "chrono")]
119impl<'de> Deserialize<'de> for Option<chrono::Duration> {
120    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
121    where
122        D: Deserializer<'de>,
123    {
124        struct OptionVisitor<T> {
125            marker: PhantomData<T>,
126        }
127
128        impl<'de, T: Deserialize<'de>> Visitor<'de> for OptionVisitor<T> {
129            type Value = Option<T>;
130
131            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
132                formatter.write_str("option")
133            }
134
135            #[inline]
136            fn visit_unit<E>(self) -> Result<Option<T>, E>
137            where
138                E: Error,
139            {
140                Ok(None)
141            }
142
143            #[inline]
144            fn visit_none<E>(self) -> Result<Option<T>, E>
145            where
146                E: Error,
147            {
148                Ok(None)
149            }
150
151            #[inline]
152            fn visit_some<D>(self, deserializer: D) -> Result<Option<T>, D::Error>
153            where
154                D: Deserializer<'de>,
155            {
156                T::deserialize(deserializer).map(Some)
157            }
158        }
159
160        deserializer.deserialize_option(OptionVisitor {
161            marker: PhantomData,
162        })
163    }
164}
165
166#[cfg(feature = "chrono")]
167impl<'de> Deserialize<'de> for Vec<chrono::Duration> {
168    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
169    where
170        D: Deserializer<'de>,
171    {
172        struct VecVisitor {
173            marker: PhantomData<Vec<Duration>>,
174        }
175        impl<'de> Visitor<'de> for VecVisitor {
176            type Value = Vec<Duration>;
177
178            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
179                formatter.write_str("array of durations in nanoseconds")
180            }
181
182            fn visit_seq<S>(self, mut visitor: S) -> Result<Self::Value, S::Error>
183            where
184                S: SeqAccess<'de>,
185            {
186                let mut durations = Vec::with_capacity(visitor.size_hint().unwrap_or(0));
187                while let Some(elem) = visitor.next_element()? {
188                    durations.push(Duration::from_nanos(elem));
189                }
190                Ok(durations)
191            }
192        }
193        deserializer.deserialize_seq(VecVisitor {
194            marker: PhantomData,
195        })
196    }
197}