1use crate::de::delegating_visitor::{DelegatingVisitor, Visitor2};
15use crate::de::null_collections_behavior::NullCollectionsBehavior;
16use crate::de::Behavior;
17use base64::engine::general_purpose::STANDARD;
18use base64::Engine;
19use serde::de::{self, Visitor};
20use serde_json::de::{IoRead, Read, SliceRead, StrRead};
21use serde_json::Error;
22use std::fmt;
23use std::io;
24
25pub fn client_from_reader<R, T>(reader: R) -> Result<T, Error>
27where
28 R: io::Read,
29 T: de::DeserializeOwned,
30{
31 let mut de = ClientDeserializer::from_reader(reader);
32 let value = T::deserialize(&mut de)?;
33 de.end()?;
34 Ok(value)
35}
36
37pub fn client_from_str<'a, T>(s: &'a str) -> Result<T, Error>
39where
40 T: de::Deserialize<'a>,
41{
42 let mut de = ClientDeserializer::from_str(s);
43 let value = T::deserialize(&mut de)?;
44 de.end()?;
45 Ok(value)
46}
47
48pub fn client_from_slice<'a, T>(s: &'a [u8]) -> Result<T, Error>
50where
51 T: de::Deserialize<'a>,
52{
53 let mut de = ClientDeserializer::from_slice(s);
54 let value = T::deserialize(&mut de)?;
55 de.end()?;
56 Ok(value)
57}
58
59pub struct ClientDeserializer<R>(serde_json::Deserializer<R>);
61
62impl<R> ClientDeserializer<IoRead<R>>
63where
64 R: io::Read,
65{
66 pub fn from_reader(reader: R) -> ClientDeserializer<IoRead<R>> {
68 ClientDeserializer(serde_json::Deserializer::from_reader(reader))
69 }
70}
71
72impl<'a> ClientDeserializer<SliceRead<'a>> {
73 pub fn from_slice(bytes: &'a [u8]) -> ClientDeserializer<SliceRead<'a>> {
75 ClientDeserializer(serde_json::Deserializer::from_slice(bytes))
76 }
77}
78
79impl<'a> ClientDeserializer<StrRead<'a>> {
80 #[allow(clippy::should_implement_trait)] pub fn from_str(s: &'a str) -> ClientDeserializer<StrRead<'a>> {
83 ClientDeserializer(serde_json::Deserializer::from_str(s))
84 }
85}
86
87impl<'de, R> ClientDeserializer<R>
88where
89 R: Read<'de>,
90{
91 pub fn end(&mut self) -> Result<(), Error> {
93 self.0.end()
94 }
95}
96
97impl<'a, 'de, R> de::Deserializer<'de> for &'a mut ClientDeserializer<R>
98where
99 R: Read<'de>,
100{
101 impl_deserialize_body!(
102 &'a mut serde_json::Deserializer<R>,
103 NullCollectionsBehavior<ValueBehavior>
104 );
105
106 fn is_human_readable(&self) -> bool {
108 true
109 }
110}
111
112pub enum ValueBehavior {}
113
114impl Behavior for ValueBehavior {
115 type KeyBehavior = KeyBehavior;
116
117 fn deserialize_f32<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
118 where
119 D: serde::Deserializer<'de>,
120 V: de::Visitor<'de>,
121 {
122 de.deserialize_any(DelegatingVisitor::new(F32Visitor, visitor))
123 }
124
125 fn deserialize_f64<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
126 where
127 D: serde::Deserializer<'de>,
128 V: de::Visitor<'de>,
129 {
130 de.deserialize_any(DelegatingVisitor::new(F64Visitor, visitor))
131 }
132
133 fn deserialize_bytes<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
134 where
135 D: serde::Deserializer<'de>,
136 V: de::Visitor<'de>,
137 {
138 de.deserialize_str(ByteBufVisitor(visitor))
139 }
140
141 fn deserialize_byte_buf<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
142 where
143 D: serde::Deserializer<'de>,
144 V: de::Visitor<'de>,
145 {
146 de.deserialize_str(ByteBufVisitor(visitor))
147 }
148}
149
150pub enum KeyBehavior {}
151
152impl Behavior for KeyBehavior {
153 type KeyBehavior = Self;
154
155 fn deserialize_bool<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
156 where
157 D: serde::Deserializer<'de>,
158 V: Visitor<'de>,
159 {
160 de.deserialize_str(BoolKeyVisitor(visitor))
161 }
162
163 fn deserialize_f32<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
164 where
165 D: serde::Deserializer<'de>,
166 V: de::Visitor<'de>,
167 {
168 de.deserialize_str(F32KeyVisitor(visitor))
169 }
170
171 fn deserialize_f64<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
172 where
173 D: serde::Deserializer<'de>,
174 V: de::Visitor<'de>,
175 {
176 de.deserialize_str(F64KeyVisitor(visitor))
177 }
178
179 fn deserialize_bytes<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
180 where
181 D: serde::Deserializer<'de>,
182 V: de::Visitor<'de>,
183 {
184 de.deserialize_str(ByteBufVisitor(visitor))
185 }
186
187 fn deserialize_byte_buf<'de, D, V>(de: D, visitor: V) -> Result<V::Value, D::Error>
188 where
189 D: serde::Deserializer<'de>,
190 V: de::Visitor<'de>,
191 {
192 de.deserialize_str(ByteBufVisitor(visitor))
193 }
194}
195
196macro_rules! float_visitor {
197 ($name:ident, $method:ident, $module:ident) => {
198 struct $name;
199
200 impl<'de, V> Visitor2<'de, V> for $name
201 where
202 V: Visitor<'de>,
203 {
204 fn visit_str<E>(self, visitor: V, v: &str) -> Result<V::Value, E>
205 where
206 E: de::Error,
207 {
208 match v {
209 "NaN" => visitor.$method($module::NAN),
210 "Infinity" => visitor.$method($module::INFINITY),
211 "-Infinity" => visitor.$method($module::NEG_INFINITY),
212 _ => visitor.visit_str(v),
213 }
214 }
215
216 fn visit_borrowed_str<E>(self, visitor: V, v: &'de str) -> Result<V::Value, E>
217 where
218 E: de::Error,
219 {
220 self.visit_str(visitor, v)
221 }
222
223 fn visit_string<E>(self, visitor: V, v: String) -> Result<V::Value, E>
224 where
225 E: de::Error,
226 {
227 self.visit_str(visitor, &v)
228 }
229 }
230 };
231}
232
233float_visitor!(F32Visitor, visit_f32, f32);
234float_visitor!(F64Visitor, visit_f64, f64);
235
236macro_rules! float_key_visitor {
238 ($name:ident, $method:ident, $module:ident) => {
239 struct $name<T>(T);
240
241 impl<'de, T> de::Visitor<'de> for $name<T>
242 where
243 T: de::Visitor<'de>,
244 {
245 type Value = T::Value;
246
247 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
248 formatter.write_str("a number")
249 }
250
251 fn visit_str<E>(self, v: &str) -> Result<T::Value, E>
252 where
253 E: de::Error,
254 {
255 match v {
256 "NaN" => (self.0).$method($module::NAN),
257 "Infinity" => (self.0).$method($module::INFINITY),
258 "-Infinity" => (self.0).$method($module::NEG_INFINITY),
259 v => match v.parse() {
260 Ok(v) => (self.0).$method(v),
261 Err(_) => Err(de::Error::invalid_value(de::Unexpected::Str(v), &self)),
262 },
263 }
264 }
265 }
266 };
267}
268
269float_key_visitor!(F32KeyVisitor, visit_f32, f32);
270float_key_visitor!(F64KeyVisitor, visit_f64, f64);
271
272struct ByteBufVisitor<T>(T);
273
274impl<'de, T> de::Visitor<'de> for ByteBufVisitor<T>
275where
276 T: de::Visitor<'de>,
277{
278 type Value = T::Value;
279
280 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
281 formatter.write_str("a base64 string")
282 }
283
284 fn visit_str<E>(self, v: &str) -> Result<T::Value, E>
285 where
286 E: de::Error,
287 {
288 match STANDARD.decode(v) {
289 Ok(v) => self.0.visit_byte_buf(v),
290 Err(_) => Err(E::invalid_value(de::Unexpected::Str(v), &self)),
291 }
292 }
293}
294
295struct BoolKeyVisitor<T>(T);
296
297impl<'de, T> Visitor<'de> for BoolKeyVisitor<T>
298where
299 T: Visitor<'de>,
300{
301 type Value = T::Value;
302
303 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
304 formatter.write_str("a boolean")
305 }
306
307 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
308 where
309 E: de::Error,
310 {
311 match v.parse() {
312 Ok(v) => self.0.visit_bool(v),
313 Err(_) => Err(E::invalid_value(de::Unexpected::Str(v), &self)),
314 }
315 }
316}