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
10pub 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}