/src/json/src/value/de.rs
Line | Count | Source |
1 | | use crate::error::{Error, ErrorCode}; |
2 | | use crate::map::Map; |
3 | | use crate::number::Number; |
4 | | use crate::value::Value; |
5 | | use alloc::borrow::{Cow, ToOwned}; |
6 | | use alloc::string::String; |
7 | | #[cfg(feature = "raw_value")] |
8 | | use alloc::string::ToString; |
9 | | use alloc::vec::{self, Vec}; |
10 | | use core::fmt; |
11 | | use core::slice; |
12 | | use core::str::FromStr; |
13 | | use serde::de::{ |
14 | | self, Deserialize, DeserializeSeed, Deserializer as _, EnumAccess, Expected, IntoDeserializer, |
15 | | MapAccess, SeqAccess, Unexpected, VariantAccess, Visitor, |
16 | | }; |
17 | | use serde::forward_to_deserialize_any; |
18 | | |
19 | | #[cfg(feature = "arbitrary_precision")] |
20 | | use crate::number::NumberFromString; |
21 | | |
22 | | impl<'de> Deserialize<'de> for Value { |
23 | | #[inline] |
24 | 1.91M | fn deserialize<D>(deserializer: D) -> Result<Value, D::Error> |
25 | 1.91M | where |
26 | 1.91M | D: serde::Deserializer<'de>, |
27 | | { |
28 | | struct ValueVisitor; |
29 | | |
30 | | impl<'de> Visitor<'de> for ValueVisitor { |
31 | | type Value = Value; |
32 | | |
33 | | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
34 | | formatter.write_str("any valid JSON value") |
35 | | } |
36 | | |
37 | | #[inline] |
38 | 19.6k | fn visit_bool<E>(self, value: bool) -> Result<Value, E> { |
39 | 19.6k | Ok(Value::Bool(value)) |
40 | 19.6k | } |
41 | | |
42 | | #[inline] |
43 | 50.5k | fn visit_i64<E>(self, value: i64) -> Result<Value, E> { |
44 | 50.5k | Ok(Value::Number(value.into())) |
45 | 50.5k | } |
46 | | |
47 | | fn visit_i128<E>(self, value: i128) -> Result<Value, E> |
48 | | where |
49 | | E: serde::de::Error, |
50 | | { |
51 | | let de = serde::de::value::I128Deserializer::new(value); |
52 | | Number::deserialize(de).map(Value::Number) |
53 | | } |
54 | | |
55 | | #[inline] |
56 | 1.56M | fn visit_u64<E>(self, value: u64) -> Result<Value, E> { |
57 | 1.56M | Ok(Value::Number(value.into())) |
58 | 1.56M | } |
59 | | |
60 | | fn visit_u128<E>(self, value: u128) -> Result<Value, E> |
61 | | where |
62 | | E: serde::de::Error, |
63 | | { |
64 | | let de = serde::de::value::U128Deserializer::new(value); |
65 | | Number::deserialize(de).map(Value::Number) |
66 | | } |
67 | | |
68 | | #[inline] |
69 | 218k | fn visit_f64<E>(self, value: f64) -> Result<Value, E> { |
70 | 218k | Ok(Number::from_f64(value).map_or(Value::Null, Value::Number)) |
71 | 218k | } |
72 | | |
73 | | #[cfg(any(feature = "std", feature = "alloc"))] |
74 | | #[inline] |
75 | 2.16k | fn visit_str<E>(self, value: &str) -> Result<Value, E> |
76 | 2.16k | where |
77 | 2.16k | E: serde::de::Error, |
78 | | { |
79 | 2.16k | self.visit_string(String::from(value)) |
80 | 2.16k | } |
81 | | |
82 | | #[cfg(any(feature = "std", feature = "alloc"))] |
83 | | #[inline] |
84 | 2.16k | fn visit_string<E>(self, value: String) -> Result<Value, E> { |
85 | 2.16k | Ok(Value::String(value)) |
86 | 2.16k | } |
87 | | |
88 | | #[inline] |
89 | | fn visit_none<E>(self) -> Result<Value, E> { |
90 | | Ok(Value::Null) |
91 | | } |
92 | | |
93 | | #[inline] |
94 | | fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error> |
95 | | where |
96 | | D: serde::Deserializer<'de>, |
97 | | { |
98 | | Deserialize::deserialize(deserializer) |
99 | | } |
100 | | |
101 | | #[inline] |
102 | 8.68k | fn visit_unit<E>(self) -> Result<Value, E> { |
103 | 8.68k | Ok(Value::Null) |
104 | 8.68k | } |
105 | | |
106 | | #[inline] |
107 | 35.4k | fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error> |
108 | 35.4k | where |
109 | 35.4k | V: SeqAccess<'de>, |
110 | | { |
111 | 35.4k | let mut vec = Vec::new(); |
112 | | |
113 | 1.64M | while let Some(elem) = tri!(visitor.next_element()) { |
114 | 1.61M | vec.push(elem); |
115 | 1.61M | } |
116 | | |
117 | 13.6k | Ok(Value::Array(vec)) |
118 | 35.4k | } <<serde_json::value::Value as serde_core::de::Deserialize>::deserialize::ValueVisitor as serde_core::de::Visitor>::visit_seq::<serde_json::de::SeqAccess<serde_json::read::SliceRead>> Line | Count | Source | 107 | 35.4k | fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error> | 108 | 35.4k | where | 109 | 35.4k | V: SeqAccess<'de>, | 110 | | { | 111 | 35.4k | let mut vec = Vec::new(); | 112 | | | 113 | 1.64M | while let Some(elem) = tri!(visitor.next_element()) { | 114 | 1.61M | vec.push(elem); | 115 | 1.61M | } | 116 | | | 117 | 13.6k | Ok(Value::Array(vec)) | 118 | 35.4k | } |
Unexecuted instantiation: <<serde_json::value::Value as serde_core::de::Deserialize>::deserialize::ValueVisitor as serde_core::de::Visitor>::visit_seq::<serde_json::de::SeqAccess<serde_json::read::StrRead>> |
119 | | |
120 | | #[cfg(any(feature = "std", feature = "alloc"))] |
121 | 9.10k | fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error> |
122 | 9.10k | where |
123 | 9.10k | V: MapAccess<'de>, |
124 | | { |
125 | 9.10k | match tri!(visitor.next_key_seed(KeyClassifier)) { |
126 | | #[cfg(feature = "arbitrary_precision")] |
127 | | Some(KeyClass::Number) => { |
128 | | let number: NumberFromString = tri!(visitor.next_value()); |
129 | | Ok(Value::Number(number.value)) |
130 | | } |
131 | | #[cfg(feature = "raw_value")] |
132 | | Some(KeyClass::RawValue) => { |
133 | | let value = tri!(visitor.next_value_seed(crate::raw::BoxedFromString)); |
134 | | crate::from_str(value.get()).map_err(de::Error::custom) |
135 | | } |
136 | 8.40k | Some(KeyClass::Map(first_key)) => { |
137 | 8.40k | let mut values = Map::new(); |
138 | | |
139 | 8.40k | values.insert(first_key, tri!(visitor.next_value())); |
140 | 266k | while let Some((key, value)) = tri!(visitor.next_entry()) { |
141 | 261k | values.insert(key, value); |
142 | 261k | } |
143 | | |
144 | 1.27k | Ok(Value::Object(values)) |
145 | | } |
146 | 294 | None => Ok(Value::Object(Map::new())), |
147 | | } |
148 | 9.10k | } <<serde_json::value::Value as serde_core::de::Deserialize>::deserialize::ValueVisitor as serde_core::de::Visitor>::visit_map::<serde_json::de::MapAccess<serde_json::read::SliceRead>> Line | Count | Source | 121 | 9.10k | fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error> | 122 | 9.10k | where | 123 | 9.10k | V: MapAccess<'de>, | 124 | | { | 125 | 9.10k | match tri!(visitor.next_key_seed(KeyClassifier)) { | 126 | | #[cfg(feature = "arbitrary_precision")] | 127 | | Some(KeyClass::Number) => { | 128 | | let number: NumberFromString = tri!(visitor.next_value()); | 129 | | Ok(Value::Number(number.value)) | 130 | | } | 131 | | #[cfg(feature = "raw_value")] | 132 | | Some(KeyClass::RawValue) => { | 133 | | let value = tri!(visitor.next_value_seed(crate::raw::BoxedFromString)); | 134 | | crate::from_str(value.get()).map_err(de::Error::custom) | 135 | | } | 136 | 8.40k | Some(KeyClass::Map(first_key)) => { | 137 | 8.40k | let mut values = Map::new(); | 138 | | | 139 | 8.40k | values.insert(first_key, tri!(visitor.next_value())); | 140 | 266k | while let Some((key, value)) = tri!(visitor.next_entry()) { | 141 | 261k | values.insert(key, value); | 142 | 261k | } | 143 | | | 144 | 1.27k | Ok(Value::Object(values)) | 145 | | } | 146 | 294 | None => Ok(Value::Object(Map::new())), | 147 | | } | 148 | 9.10k | } |
Unexecuted instantiation: <<serde_json::value::Value as serde_core::de::Deserialize>::deserialize::ValueVisitor as serde_core::de::Visitor>::visit_map::<serde_json::de::MapAccess<serde_json::read::StrRead>> |
149 | | } |
150 | | |
151 | 1.91M | deserializer.deserialize_any(ValueVisitor) |
152 | 1.91M | } <serde_json::value::Value as serde_core::de::Deserialize>::deserialize::<&mut serde_json::de::Deserializer<serde_json::read::SliceRead>> Line | Count | Source | 24 | 1.91M | fn deserialize<D>(deserializer: D) -> Result<Value, D::Error> | 25 | 1.91M | where | 26 | 1.91M | D: serde::Deserializer<'de>, | 27 | | { | 28 | | struct ValueVisitor; | 29 | | | 30 | | impl<'de> Visitor<'de> for ValueVisitor { | 31 | | type Value = Value; | 32 | | | 33 | | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { | 34 | | formatter.write_str("any valid JSON value") | 35 | | } | 36 | | | 37 | | #[inline] | 38 | | fn visit_bool<E>(self, value: bool) -> Result<Value, E> { | 39 | | Ok(Value::Bool(value)) | 40 | | } | 41 | | | 42 | | #[inline] | 43 | | fn visit_i64<E>(self, value: i64) -> Result<Value, E> { | 44 | | Ok(Value::Number(value.into())) | 45 | | } | 46 | | | 47 | | fn visit_i128<E>(self, value: i128) -> Result<Value, E> | 48 | | where | 49 | | E: serde::de::Error, | 50 | | { | 51 | | let de = serde::de::value::I128Deserializer::new(value); | 52 | | Number::deserialize(de).map(Value::Number) | 53 | | } | 54 | | | 55 | | #[inline] | 56 | | fn visit_u64<E>(self, value: u64) -> Result<Value, E> { | 57 | | Ok(Value::Number(value.into())) | 58 | | } | 59 | | | 60 | | fn visit_u128<E>(self, value: u128) -> Result<Value, E> | 61 | | where | 62 | | E: serde::de::Error, | 63 | | { | 64 | | let de = serde::de::value::U128Deserializer::new(value); | 65 | | Number::deserialize(de).map(Value::Number) | 66 | | } | 67 | | | 68 | | #[inline] | 69 | | fn visit_f64<E>(self, value: f64) -> Result<Value, E> { | 70 | | Ok(Number::from_f64(value).map_or(Value::Null, Value::Number)) | 71 | | } | 72 | | | 73 | | #[cfg(any(feature = "std", feature = "alloc"))] | 74 | | #[inline] | 75 | | fn visit_str<E>(self, value: &str) -> Result<Value, E> | 76 | | where | 77 | | E: serde::de::Error, | 78 | | { | 79 | | self.visit_string(String::from(value)) | 80 | | } | 81 | | | 82 | | #[cfg(any(feature = "std", feature = "alloc"))] | 83 | | #[inline] | 84 | | fn visit_string<E>(self, value: String) -> Result<Value, E> { | 85 | | Ok(Value::String(value)) | 86 | | } | 87 | | | 88 | | #[inline] | 89 | | fn visit_none<E>(self) -> Result<Value, E> { | 90 | | Ok(Value::Null) | 91 | | } | 92 | | | 93 | | #[inline] | 94 | | fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error> | 95 | | where | 96 | | D: serde::Deserializer<'de>, | 97 | | { | 98 | | Deserialize::deserialize(deserializer) | 99 | | } | 100 | | | 101 | | #[inline] | 102 | | fn visit_unit<E>(self) -> Result<Value, E> { | 103 | | Ok(Value::Null) | 104 | | } | 105 | | | 106 | | #[inline] | 107 | | fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error> | 108 | | where | 109 | | V: SeqAccess<'de>, | 110 | | { | 111 | | let mut vec = Vec::new(); | 112 | | | 113 | | while let Some(elem) = tri!(visitor.next_element()) { | 114 | | vec.push(elem); | 115 | | } | 116 | | | 117 | | Ok(Value::Array(vec)) | 118 | | } | 119 | | | 120 | | #[cfg(any(feature = "std", feature = "alloc"))] | 121 | | fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error> | 122 | | where | 123 | | V: MapAccess<'de>, | 124 | | { | 125 | | match tri!(visitor.next_key_seed(KeyClassifier)) { | 126 | | #[cfg(feature = "arbitrary_precision")] | 127 | | Some(KeyClass::Number) => { | 128 | | let number: NumberFromString = tri!(visitor.next_value()); | 129 | | Ok(Value::Number(number.value)) | 130 | | } | 131 | | #[cfg(feature = "raw_value")] | 132 | | Some(KeyClass::RawValue) => { | 133 | | let value = tri!(visitor.next_value_seed(crate::raw::BoxedFromString)); | 134 | | crate::from_str(value.get()).map_err(de::Error::custom) | 135 | | } | 136 | | Some(KeyClass::Map(first_key)) => { | 137 | | let mut values = Map::new(); | 138 | | | 139 | | values.insert(first_key, tri!(visitor.next_value())); | 140 | | while let Some((key, value)) = tri!(visitor.next_entry()) { | 141 | | values.insert(key, value); | 142 | | } | 143 | | | 144 | | Ok(Value::Object(values)) | 145 | | } | 146 | | None => Ok(Value::Object(Map::new())), | 147 | | } | 148 | | } | 149 | | } | 150 | | | 151 | 1.91M | deserializer.deserialize_any(ValueVisitor) | 152 | 1.91M | } |
Unexecuted instantiation: <serde_json::value::Value as serde_core::de::Deserialize>::deserialize::<&mut serde_json::de::Deserializer<serde_json::read::StrRead>> |
153 | | } |
154 | | |
155 | | impl FromStr for Value { |
156 | | type Err = Error; |
157 | 0 | fn from_str(s: &str) -> Result<Value, Error> { |
158 | 0 | crate::from_str(s) |
159 | 0 | } |
160 | | } |
161 | | |
162 | | impl FromStr for Map<String, Value> { |
163 | | type Err = Error; |
164 | 0 | fn from_str(s: &str) -> Result<Self, Error> { |
165 | 0 | crate::from_str(s) |
166 | 0 | } |
167 | | } |
168 | | |
169 | | macro_rules! deserialize_number { |
170 | | ($method:ident) => { |
171 | | #[cfg(not(feature = "arbitrary_precision"))] |
172 | | fn $method<V>(self, visitor: V) -> Result<V::Value, Error> |
173 | | where |
174 | | V: Visitor<'de>, |
175 | | { |
176 | | match self { |
177 | | Value::Number(n) => n.deserialize_any(visitor), |
178 | | _ => Err(self.invalid_type(&visitor)), |
179 | | } |
180 | | } |
181 | | |
182 | | #[cfg(feature = "arbitrary_precision")] |
183 | | fn $method<V>(self, visitor: V) -> Result<V::Value, Error> |
184 | | where |
185 | | V: Visitor<'de>, |
186 | | { |
187 | | match self { |
188 | | Value::Number(n) => n.$method(visitor), |
189 | | _ => self.deserialize_any(visitor), |
190 | | } |
191 | | } |
192 | | }; |
193 | | } |
194 | | |
195 | | fn visit_array<'de, V>(array: Vec<Value>, visitor: V) -> Result<V::Value, Error> |
196 | | where |
197 | | V: Visitor<'de>, |
198 | | { |
199 | | let len = array.len(); |
200 | | let mut deserializer = SeqDeserializer::new(array); |
201 | | let seq = tri!(visitor.visit_seq(&mut deserializer)); |
202 | | let remaining = deserializer.iter.len(); |
203 | | if remaining == 0 { |
204 | | Ok(seq) |
205 | | } else { |
206 | | Err(serde::de::Error::invalid_length( |
207 | | len, |
208 | | &"fewer elements in array", |
209 | | )) |
210 | | } |
211 | | } |
212 | | |
213 | | impl<'de> serde::Deserializer<'de> for Map<String, Value> { |
214 | | type Error = Error; |
215 | | |
216 | | fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> |
217 | | where |
218 | | V: Visitor<'de>, |
219 | | { |
220 | | let len = self.len(); |
221 | | let mut deserializer = MapDeserializer::new(self); |
222 | | let map = tri!(visitor.visit_map(&mut deserializer)); |
223 | | let remaining = deserializer.iter.len(); |
224 | | if remaining == 0 { |
225 | | Ok(map) |
226 | | } else { |
227 | | Err(serde::de::Error::invalid_length( |
228 | | len, |
229 | | &"fewer elements in map", |
230 | | )) |
231 | | } |
232 | | } |
233 | | |
234 | | fn deserialize_enum<V>( |
235 | | self, |
236 | | _name: &'static str, |
237 | | _variants: &'static [&'static str], |
238 | | visitor: V, |
239 | | ) -> Result<V::Value, Self::Error> |
240 | | where |
241 | | V: Visitor<'de>, |
242 | | { |
243 | | let mut iter = self.into_iter(); |
244 | | let (variant, value) = match iter.next() { |
245 | | Some(v) => v, |
246 | | None => { |
247 | | return Err(serde::de::Error::invalid_value( |
248 | | Unexpected::Map, |
249 | | &"map with a single key", |
250 | | )); |
251 | | } |
252 | | }; |
253 | | // enums are encoded in json as maps with a single key:value pair |
254 | | if iter.next().is_some() { |
255 | | return Err(serde::de::Error::invalid_value( |
256 | | Unexpected::Map, |
257 | | &"map with a single key", |
258 | | )); |
259 | | } |
260 | | |
261 | | visitor.visit_enum(EnumDeserializer { |
262 | | variant, |
263 | | value: Some(value), |
264 | | }) |
265 | | } |
266 | | |
267 | | fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> |
268 | | where |
269 | | V: Visitor<'de>, |
270 | | { |
271 | | drop(self); |
272 | | visitor.visit_unit() |
273 | | } |
274 | | |
275 | | forward_to_deserialize_any! { |
276 | | bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string |
277 | | bytes byte_buf option unit unit_struct newtype_struct seq tuple |
278 | | tuple_struct map struct identifier |
279 | | } |
280 | | } |
281 | | |
282 | | impl<'de> serde::Deserializer<'de> for Value { |
283 | | type Error = Error; |
284 | | |
285 | | #[inline] |
286 | | fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> |
287 | | where |
288 | | V: Visitor<'de>, |
289 | | { |
290 | | match self { |
291 | | Value::Null => visitor.visit_unit(), |
292 | | Value::Bool(v) => visitor.visit_bool(v), |
293 | | Value::Number(n) => n.deserialize_any(visitor), |
294 | | #[cfg(any(feature = "std", feature = "alloc"))] |
295 | | Value::String(v) => visitor.visit_string(v), |
296 | | #[cfg(not(any(feature = "std", feature = "alloc")))] |
297 | | Value::String(_) => unreachable!(), |
298 | | Value::Array(v) => visit_array(v, visitor), |
299 | | Value::Object(v) => v.deserialize_any(visitor), |
300 | | } |
301 | | } |
302 | | |
303 | | deserialize_number!(deserialize_i8); |
304 | | deserialize_number!(deserialize_i16); |
305 | | deserialize_number!(deserialize_i32); |
306 | | deserialize_number!(deserialize_i64); |
307 | | deserialize_number!(deserialize_i128); |
308 | | deserialize_number!(deserialize_u8); |
309 | | deserialize_number!(deserialize_u16); |
310 | | deserialize_number!(deserialize_u32); |
311 | | deserialize_number!(deserialize_u64); |
312 | | deserialize_number!(deserialize_u128); |
313 | | deserialize_number!(deserialize_f32); |
314 | | deserialize_number!(deserialize_f64); |
315 | | |
316 | | #[inline] |
317 | | fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> |
318 | | where |
319 | | V: Visitor<'de>, |
320 | | { |
321 | | match self { |
322 | | Value::Null => visitor.visit_none(), |
323 | | _ => visitor.visit_some(self), |
324 | | } |
325 | | } |
326 | | |
327 | | #[inline] |
328 | | fn deserialize_enum<V>( |
329 | | self, |
330 | | name: &'static str, |
331 | | variants: &'static [&'static str], |
332 | | visitor: V, |
333 | | ) -> Result<V::Value, Error> |
334 | | where |
335 | | V: Visitor<'de>, |
336 | | { |
337 | | match self { |
338 | | Value::Object(value) => value.deserialize_enum(name, variants, visitor), |
339 | | Value::String(variant) => visitor.visit_enum(EnumDeserializer { |
340 | | variant, |
341 | | value: None, |
342 | | }), |
343 | | other => Err(serde::de::Error::invalid_type( |
344 | | other.unexpected(), |
345 | | &"string or map", |
346 | | )), |
347 | | } |
348 | | } |
349 | | |
350 | | #[inline] |
351 | | fn deserialize_newtype_struct<V>( |
352 | | self, |
353 | | name: &'static str, |
354 | | visitor: V, |
355 | | ) -> Result<V::Value, Error> |
356 | | where |
357 | | V: Visitor<'de>, |
358 | | { |
359 | | #[cfg(feature = "raw_value")] |
360 | | { |
361 | | if name == crate::raw::TOKEN { |
362 | | return visitor.visit_map(crate::raw::OwnedRawDeserializer { |
363 | | raw_value: Some(self.to_string()), |
364 | | }); |
365 | | } |
366 | | } |
367 | | |
368 | | let _ = name; |
369 | | visitor.visit_newtype_struct(self) |
370 | | } |
371 | | |
372 | | fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error> |
373 | | where |
374 | | V: Visitor<'de>, |
375 | | { |
376 | | match self { |
377 | | Value::Bool(v) => visitor.visit_bool(v), |
378 | | _ => Err(self.invalid_type(&visitor)), |
379 | | } |
380 | | } |
381 | | |
382 | | fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error> |
383 | | where |
384 | | V: Visitor<'de>, |
385 | | { |
386 | | self.deserialize_string(visitor) |
387 | | } |
388 | | |
389 | | fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error> |
390 | | where |
391 | | V: Visitor<'de>, |
392 | | { |
393 | | self.deserialize_string(visitor) |
394 | | } |
395 | | |
396 | | fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error> |
397 | | where |
398 | | V: Visitor<'de>, |
399 | | { |
400 | | match self { |
401 | | #[cfg(any(feature = "std", feature = "alloc"))] |
402 | | Value::String(v) => visitor.visit_string(v), |
403 | | _ => Err(self.invalid_type(&visitor)), |
404 | | } |
405 | | } |
406 | | |
407 | | fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error> |
408 | | where |
409 | | V: Visitor<'de>, |
410 | | { |
411 | | self.deserialize_byte_buf(visitor) |
412 | | } |
413 | | |
414 | | fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error> |
415 | | where |
416 | | V: Visitor<'de>, |
417 | | { |
418 | | match self { |
419 | | #[cfg(any(feature = "std", feature = "alloc"))] |
420 | | Value::String(v) => visitor.visit_string(v), |
421 | | Value::Array(v) => visit_array(v, visitor), |
422 | | _ => Err(self.invalid_type(&visitor)), |
423 | | } |
424 | | } |
425 | | |
426 | 0 | fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error> |
427 | 0 | where |
428 | 0 | V: Visitor<'de>, |
429 | | { |
430 | 0 | match self { |
431 | 0 | Value::Null => visitor.visit_unit(), |
432 | 0 | _ => Err(self.invalid_type(&visitor)), |
433 | | } |
434 | 0 | } |
435 | | |
436 | | fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error> |
437 | | where |
438 | | V: Visitor<'de>, |
439 | | { |
440 | | self.deserialize_unit(visitor) |
441 | | } |
442 | | |
443 | | fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error> |
444 | | where |
445 | | V: Visitor<'de>, |
446 | | { |
447 | | match self { |
448 | | Value::Array(v) => visit_array(v, visitor), |
449 | | _ => Err(self.invalid_type(&visitor)), |
450 | | } |
451 | | } |
452 | | |
453 | | fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> |
454 | | where |
455 | | V: Visitor<'de>, |
456 | | { |
457 | | self.deserialize_seq(visitor) |
458 | | } |
459 | | |
460 | | fn deserialize_tuple_struct<V>( |
461 | | self, |
462 | | _name: &'static str, |
463 | | _len: usize, |
464 | | visitor: V, |
465 | | ) -> Result<V::Value, Error> |
466 | | where |
467 | | V: Visitor<'de>, |
468 | | { |
469 | | self.deserialize_seq(visitor) |
470 | | } |
471 | | |
472 | | fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error> |
473 | | where |
474 | | V: Visitor<'de>, |
475 | | { |
476 | | match self { |
477 | | Value::Object(v) => v.deserialize_any(visitor), |
478 | | _ => Err(self.invalid_type(&visitor)), |
479 | | } |
480 | | } |
481 | | |
482 | | fn deserialize_struct<V>( |
483 | | self, |
484 | | _name: &'static str, |
485 | | _fields: &'static [&'static str], |
486 | | visitor: V, |
487 | | ) -> Result<V::Value, Error> |
488 | | where |
489 | | V: Visitor<'de>, |
490 | | { |
491 | | match self { |
492 | | Value::Array(v) => visit_array(v, visitor), |
493 | | Value::Object(v) => v.deserialize_any(visitor), |
494 | | _ => Err(self.invalid_type(&visitor)), |
495 | | } |
496 | | } |
497 | | |
498 | | fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error> |
499 | | where |
500 | | V: Visitor<'de>, |
501 | | { |
502 | | self.deserialize_string(visitor) |
503 | | } |
504 | | |
505 | | fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error> |
506 | | where |
507 | | V: Visitor<'de>, |
508 | | { |
509 | | drop(self); |
510 | | visitor.visit_unit() |
511 | | } |
512 | | } |
513 | | |
514 | | struct EnumDeserializer { |
515 | | variant: String, |
516 | | value: Option<Value>, |
517 | | } |
518 | | |
519 | | impl<'de> EnumAccess<'de> for EnumDeserializer { |
520 | | type Error = Error; |
521 | | type Variant = VariantDeserializer; |
522 | | |
523 | | fn variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer), Error> |
524 | | where |
525 | | V: DeserializeSeed<'de>, |
526 | | { |
527 | | let variant = self.variant.into_deserializer(); |
528 | | let visitor = VariantDeserializer { value: self.value }; |
529 | | seed.deserialize(variant).map(|v| (v, visitor)) |
530 | | } |
531 | | } |
532 | | |
533 | | impl<'de> IntoDeserializer<'de, Error> for Value { |
534 | | type Deserializer = Self; |
535 | | |
536 | 0 | fn into_deserializer(self) -> Self::Deserializer { |
537 | 0 | self |
538 | 0 | } |
539 | | } |
540 | | |
541 | | impl<'de> IntoDeserializer<'de, Error> for &'de Value { |
542 | | type Deserializer = Self; |
543 | | |
544 | 0 | fn into_deserializer(self) -> Self::Deserializer { |
545 | 0 | self |
546 | 0 | } |
547 | | } |
548 | | |
549 | | struct VariantDeserializer { |
550 | | value: Option<Value>, |
551 | | } |
552 | | |
553 | | impl<'de> VariantAccess<'de> for VariantDeserializer { |
554 | | type Error = Error; |
555 | | |
556 | | fn unit_variant(self) -> Result<(), Error> { |
557 | | match self.value { |
558 | | Some(value) => Deserialize::deserialize(value), |
559 | | None => Ok(()), |
560 | | } |
561 | | } |
562 | | |
563 | | fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error> |
564 | | where |
565 | | T: DeserializeSeed<'de>, |
566 | | { |
567 | | match self.value { |
568 | | Some(value) => seed.deserialize(value), |
569 | | None => Err(serde::de::Error::invalid_type( |
570 | | Unexpected::UnitVariant, |
571 | | &"newtype variant", |
572 | | )), |
573 | | } |
574 | | } |
575 | | |
576 | | fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> |
577 | | where |
578 | | V: Visitor<'de>, |
579 | | { |
580 | | match self.value { |
581 | | Some(Value::Array(v)) => { |
582 | | if v.is_empty() { |
583 | | visitor.visit_unit() |
584 | | } else { |
585 | | visit_array(v, visitor) |
586 | | } |
587 | | } |
588 | | Some(other) => Err(serde::de::Error::invalid_type( |
589 | | other.unexpected(), |
590 | | &"tuple variant", |
591 | | )), |
592 | | None => Err(serde::de::Error::invalid_type( |
593 | | Unexpected::UnitVariant, |
594 | | &"tuple variant", |
595 | | )), |
596 | | } |
597 | | } |
598 | | |
599 | | fn struct_variant<V>( |
600 | | self, |
601 | | _fields: &'static [&'static str], |
602 | | visitor: V, |
603 | | ) -> Result<V::Value, Error> |
604 | | where |
605 | | V: Visitor<'de>, |
606 | | { |
607 | | match self.value { |
608 | | Some(Value::Object(v)) => v.deserialize_any(visitor), |
609 | | Some(other) => Err(serde::de::Error::invalid_type( |
610 | | other.unexpected(), |
611 | | &"struct variant", |
612 | | )), |
613 | | None => Err(serde::de::Error::invalid_type( |
614 | | Unexpected::UnitVariant, |
615 | | &"struct variant", |
616 | | )), |
617 | | } |
618 | | } |
619 | | } |
620 | | |
621 | | struct SeqDeserializer { |
622 | | iter: vec::IntoIter<Value>, |
623 | | } |
624 | | |
625 | | impl SeqDeserializer { |
626 | | fn new(vec: Vec<Value>) -> Self { |
627 | | SeqDeserializer { |
628 | | iter: vec.into_iter(), |
629 | | } |
630 | | } |
631 | | } |
632 | | |
633 | | impl<'de> SeqAccess<'de> for SeqDeserializer { |
634 | | type Error = Error; |
635 | | |
636 | | fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> |
637 | | where |
638 | | T: DeserializeSeed<'de>, |
639 | | { |
640 | | match self.iter.next() { |
641 | | Some(value) => seed.deserialize(value).map(Some), |
642 | | None => Ok(None), |
643 | | } |
644 | | } |
645 | | |
646 | | fn size_hint(&self) -> Option<usize> { |
647 | | match self.iter.size_hint() { |
648 | | (lower, Some(upper)) if lower == upper => Some(upper), |
649 | | _ => None, |
650 | | } |
651 | | } |
652 | | } |
653 | | |
654 | | struct MapDeserializer { |
655 | | iter: <Map<String, Value> as IntoIterator>::IntoIter, |
656 | | value: Option<Value>, |
657 | | } |
658 | | |
659 | | impl MapDeserializer { |
660 | | fn new(map: Map<String, Value>) -> Self { |
661 | | MapDeserializer { |
662 | | iter: map.into_iter(), |
663 | | value: None, |
664 | | } |
665 | | } |
666 | | } |
667 | | |
668 | | impl<'de> MapAccess<'de> for MapDeserializer { |
669 | | type Error = Error; |
670 | | |
671 | | fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> |
672 | | where |
673 | | T: DeserializeSeed<'de>, |
674 | | { |
675 | | match self.iter.next() { |
676 | | Some((key, value)) => { |
677 | | self.value = Some(value); |
678 | | let key_de = MapKeyDeserializer { |
679 | | key: Cow::Owned(key), |
680 | | }; |
681 | | seed.deserialize(key_de).map(Some) |
682 | | } |
683 | | None => Ok(None), |
684 | | } |
685 | | } |
686 | | |
687 | | fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error> |
688 | | where |
689 | | T: DeserializeSeed<'de>, |
690 | | { |
691 | | match self.value.take() { |
692 | | Some(value) => seed.deserialize(value), |
693 | | None => Err(serde::de::Error::custom("value is missing")), |
694 | | } |
695 | | } |
696 | | |
697 | | fn size_hint(&self) -> Option<usize> { |
698 | | match self.iter.size_hint() { |
699 | | (lower, Some(upper)) if lower == upper => Some(upper), |
700 | | _ => None, |
701 | | } |
702 | | } |
703 | | } |
704 | | |
705 | | macro_rules! deserialize_value_ref_number { |
706 | | ($method:ident) => { |
707 | | #[cfg(not(feature = "arbitrary_precision"))] |
708 | | fn $method<V>(self, visitor: V) -> Result<V::Value, Error> |
709 | | where |
710 | | V: Visitor<'de>, |
711 | | { |
712 | | match self { |
713 | | Value::Number(n) => n.deserialize_any(visitor), |
714 | | _ => Err(self.invalid_type(&visitor)), |
715 | | } |
716 | | } |
717 | | |
718 | | #[cfg(feature = "arbitrary_precision")] |
719 | | fn $method<V>(self, visitor: V) -> Result<V::Value, Error> |
720 | | where |
721 | | V: Visitor<'de>, |
722 | | { |
723 | | match self { |
724 | | Value::Number(n) => n.$method(visitor), |
725 | | _ => self.deserialize_any(visitor), |
726 | | } |
727 | | } |
728 | | }; |
729 | | } |
730 | | |
731 | | fn visit_array_ref<'de, V>(array: &'de [Value], visitor: V) -> Result<V::Value, Error> |
732 | | where |
733 | | V: Visitor<'de>, |
734 | | { |
735 | | let len = array.len(); |
736 | | let mut deserializer = SeqRefDeserializer::new(array); |
737 | | let seq = tri!(visitor.visit_seq(&mut deserializer)); |
738 | | let remaining = deserializer.iter.len(); |
739 | | if remaining == 0 { |
740 | | Ok(seq) |
741 | | } else { |
742 | | Err(serde::de::Error::invalid_length( |
743 | | len, |
744 | | &"fewer elements in array", |
745 | | )) |
746 | | } |
747 | | } |
748 | | |
749 | | impl<'de> serde::Deserializer<'de> for &'de Map<String, Value> { |
750 | | type Error = Error; |
751 | | |
752 | | fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> |
753 | | where |
754 | | V: Visitor<'de>, |
755 | | { |
756 | | let len = self.len(); |
757 | | let mut deserializer = MapRefDeserializer::new(self); |
758 | | let map = tri!(visitor.visit_map(&mut deserializer)); |
759 | | let remaining = deserializer.iter.len(); |
760 | | if remaining == 0 { |
761 | | Ok(map) |
762 | | } else { |
763 | | Err(serde::de::Error::invalid_length( |
764 | | len, |
765 | | &"fewer elements in map", |
766 | | )) |
767 | | } |
768 | | } |
769 | | |
770 | | fn deserialize_enum<V>( |
771 | | self, |
772 | | _name: &'static str, |
773 | | _variants: &'static [&'static str], |
774 | | visitor: V, |
775 | | ) -> Result<V::Value, Self::Error> |
776 | | where |
777 | | V: Visitor<'de>, |
778 | | { |
779 | | let mut iter = self.into_iter(); |
780 | | let (variant, value) = match iter.next() { |
781 | | Some(v) => v, |
782 | | None => { |
783 | | return Err(serde::de::Error::invalid_value( |
784 | | Unexpected::Map, |
785 | | &"map with a single key", |
786 | | )); |
787 | | } |
788 | | }; |
789 | | // enums are encoded in json as maps with a single key:value pair |
790 | | if iter.next().is_some() { |
791 | | return Err(serde::de::Error::invalid_value( |
792 | | Unexpected::Map, |
793 | | &"map with a single key", |
794 | | )); |
795 | | } |
796 | | |
797 | | visitor.visit_enum(EnumRefDeserializer { |
798 | | variant, |
799 | | value: Some(value), |
800 | | }) |
801 | | } |
802 | | |
803 | | fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error> |
804 | | where |
805 | | V: Visitor<'de>, |
806 | | { |
807 | | visitor.visit_unit() |
808 | | } |
809 | | |
810 | | forward_to_deserialize_any! { |
811 | | bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string |
812 | | bytes byte_buf option unit unit_struct newtype_struct seq tuple |
813 | | tuple_struct map struct identifier |
814 | | } |
815 | | } |
816 | | |
817 | | impl<'de> serde::Deserializer<'de> for &'de Value { |
818 | | type Error = Error; |
819 | | |
820 | | fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> |
821 | | where |
822 | | V: Visitor<'de>, |
823 | | { |
824 | | match self { |
825 | | Value::Null => visitor.visit_unit(), |
826 | | Value::Bool(v) => visitor.visit_bool(*v), |
827 | | Value::Number(n) => n.deserialize_any(visitor), |
828 | | Value::String(v) => visitor.visit_borrowed_str(v), |
829 | | Value::Array(v) => visit_array_ref(v, visitor), |
830 | | Value::Object(v) => v.deserialize_any(visitor), |
831 | | } |
832 | | } |
833 | | |
834 | | deserialize_value_ref_number!(deserialize_i8); |
835 | | deserialize_value_ref_number!(deserialize_i16); |
836 | | deserialize_value_ref_number!(deserialize_i32); |
837 | | deserialize_value_ref_number!(deserialize_i64); |
838 | | deserialize_number!(deserialize_i128); |
839 | | deserialize_value_ref_number!(deserialize_u8); |
840 | | deserialize_value_ref_number!(deserialize_u16); |
841 | | deserialize_value_ref_number!(deserialize_u32); |
842 | | deserialize_value_ref_number!(deserialize_u64); |
843 | | deserialize_number!(deserialize_u128); |
844 | | deserialize_value_ref_number!(deserialize_f32); |
845 | | deserialize_value_ref_number!(deserialize_f64); |
846 | | |
847 | | fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> |
848 | | where |
849 | | V: Visitor<'de>, |
850 | | { |
851 | | match *self { |
852 | | Value::Null => visitor.visit_none(), |
853 | | _ => visitor.visit_some(self), |
854 | | } |
855 | | } |
856 | | |
857 | | fn deserialize_enum<V>( |
858 | | self, |
859 | | name: &'static str, |
860 | | variants: &'static [&'static str], |
861 | | visitor: V, |
862 | | ) -> Result<V::Value, Error> |
863 | | where |
864 | | V: Visitor<'de>, |
865 | | { |
866 | | match self { |
867 | | Value::Object(value) => value.deserialize_enum(name, variants, visitor), |
868 | | Value::String(variant) => visitor.visit_enum(EnumRefDeserializer { |
869 | | variant, |
870 | | value: None, |
871 | | }), |
872 | | other => Err(serde::de::Error::invalid_type( |
873 | | other.unexpected(), |
874 | | &"string or map", |
875 | | )), |
876 | | } |
877 | | } |
878 | | |
879 | | #[inline] |
880 | | fn deserialize_newtype_struct<V>( |
881 | | self, |
882 | | name: &'static str, |
883 | | visitor: V, |
884 | | ) -> Result<V::Value, Error> |
885 | | where |
886 | | V: Visitor<'de>, |
887 | | { |
888 | | #[cfg(feature = "raw_value")] |
889 | | { |
890 | | if name == crate::raw::TOKEN { |
891 | | return visitor.visit_map(crate::raw::OwnedRawDeserializer { |
892 | | raw_value: Some(self.to_string()), |
893 | | }); |
894 | | } |
895 | | } |
896 | | |
897 | | let _ = name; |
898 | | visitor.visit_newtype_struct(self) |
899 | | } |
900 | | |
901 | | fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error> |
902 | | where |
903 | | V: Visitor<'de>, |
904 | | { |
905 | | match *self { |
906 | | Value::Bool(v) => visitor.visit_bool(v), |
907 | | _ => Err(self.invalid_type(&visitor)), |
908 | | } |
909 | | } |
910 | | |
911 | | fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error> |
912 | | where |
913 | | V: Visitor<'de>, |
914 | | { |
915 | | self.deserialize_str(visitor) |
916 | | } |
917 | | |
918 | | fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error> |
919 | | where |
920 | | V: Visitor<'de>, |
921 | | { |
922 | | match self { |
923 | | Value::String(v) => visitor.visit_borrowed_str(v), |
924 | | _ => Err(self.invalid_type(&visitor)), |
925 | | } |
926 | | } |
927 | | |
928 | | fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error> |
929 | | where |
930 | | V: Visitor<'de>, |
931 | | { |
932 | | self.deserialize_str(visitor) |
933 | | } |
934 | | |
935 | | fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error> |
936 | | where |
937 | | V: Visitor<'de>, |
938 | | { |
939 | | match self { |
940 | | Value::String(v) => visitor.visit_borrowed_str(v), |
941 | | Value::Array(v) => visit_array_ref(v, visitor), |
942 | | _ => Err(self.invalid_type(&visitor)), |
943 | | } |
944 | | } |
945 | | |
946 | | fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error> |
947 | | where |
948 | | V: Visitor<'de>, |
949 | | { |
950 | | self.deserialize_bytes(visitor) |
951 | | } |
952 | | |
953 | 0 | fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error> |
954 | 0 | where |
955 | 0 | V: Visitor<'de>, |
956 | | { |
957 | 0 | match *self { |
958 | 0 | Value::Null => visitor.visit_unit(), |
959 | 0 | _ => Err(self.invalid_type(&visitor)), |
960 | | } |
961 | 0 | } |
962 | | |
963 | | fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error> |
964 | | where |
965 | | V: Visitor<'de>, |
966 | | { |
967 | | self.deserialize_unit(visitor) |
968 | | } |
969 | | |
970 | | fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error> |
971 | | where |
972 | | V: Visitor<'de>, |
973 | | { |
974 | | match self { |
975 | | Value::Array(v) => visit_array_ref(v, visitor), |
976 | | _ => Err(self.invalid_type(&visitor)), |
977 | | } |
978 | | } |
979 | | |
980 | | fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> |
981 | | where |
982 | | V: Visitor<'de>, |
983 | | { |
984 | | self.deserialize_seq(visitor) |
985 | | } |
986 | | |
987 | | fn deserialize_tuple_struct<V>( |
988 | | self, |
989 | | _name: &'static str, |
990 | | _len: usize, |
991 | | visitor: V, |
992 | | ) -> Result<V::Value, Error> |
993 | | where |
994 | | V: Visitor<'de>, |
995 | | { |
996 | | self.deserialize_seq(visitor) |
997 | | } |
998 | | |
999 | | fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error> |
1000 | | where |
1001 | | V: Visitor<'de>, |
1002 | | { |
1003 | | match self { |
1004 | | Value::Object(v) => v.deserialize_any(visitor), |
1005 | | _ => Err(self.invalid_type(&visitor)), |
1006 | | } |
1007 | | } |
1008 | | |
1009 | | fn deserialize_struct<V>( |
1010 | | self, |
1011 | | _name: &'static str, |
1012 | | _fields: &'static [&'static str], |
1013 | | visitor: V, |
1014 | | ) -> Result<V::Value, Error> |
1015 | | where |
1016 | | V: Visitor<'de>, |
1017 | | { |
1018 | | match self { |
1019 | | Value::Array(v) => visit_array_ref(v, visitor), |
1020 | | Value::Object(v) => v.deserialize_any(visitor), |
1021 | | _ => Err(self.invalid_type(&visitor)), |
1022 | | } |
1023 | | } |
1024 | | |
1025 | | fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error> |
1026 | | where |
1027 | | V: Visitor<'de>, |
1028 | | { |
1029 | | self.deserialize_str(visitor) |
1030 | | } |
1031 | | |
1032 | | fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error> |
1033 | | where |
1034 | | V: Visitor<'de>, |
1035 | | { |
1036 | | visitor.visit_unit() |
1037 | | } |
1038 | | } |
1039 | | |
1040 | | struct EnumRefDeserializer<'de> { |
1041 | | variant: &'de str, |
1042 | | value: Option<&'de Value>, |
1043 | | } |
1044 | | |
1045 | | impl<'de> EnumAccess<'de> for EnumRefDeserializer<'de> { |
1046 | | type Error = Error; |
1047 | | type Variant = VariantRefDeserializer<'de>; |
1048 | | |
1049 | | fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error> |
1050 | | where |
1051 | | V: DeserializeSeed<'de>, |
1052 | | { |
1053 | | let variant = self.variant.into_deserializer(); |
1054 | | let visitor = VariantRefDeserializer { value: self.value }; |
1055 | | seed.deserialize(variant).map(|v| (v, visitor)) |
1056 | | } |
1057 | | } |
1058 | | |
1059 | | struct VariantRefDeserializer<'de> { |
1060 | | value: Option<&'de Value>, |
1061 | | } |
1062 | | |
1063 | | impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> { |
1064 | | type Error = Error; |
1065 | | |
1066 | | fn unit_variant(self) -> Result<(), Error> { |
1067 | | match self.value { |
1068 | | Some(value) => Deserialize::deserialize(value), |
1069 | | None => Ok(()), |
1070 | | } |
1071 | | } |
1072 | | |
1073 | | fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error> |
1074 | | where |
1075 | | T: DeserializeSeed<'de>, |
1076 | | { |
1077 | | match self.value { |
1078 | | Some(value) => seed.deserialize(value), |
1079 | | None => Err(serde::de::Error::invalid_type( |
1080 | | Unexpected::UnitVariant, |
1081 | | &"newtype variant", |
1082 | | )), |
1083 | | } |
1084 | | } |
1085 | | |
1086 | | fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> |
1087 | | where |
1088 | | V: Visitor<'de>, |
1089 | | { |
1090 | | match self.value { |
1091 | | Some(Value::Array(v)) => { |
1092 | | if v.is_empty() { |
1093 | | visitor.visit_unit() |
1094 | | } else { |
1095 | | visit_array_ref(v, visitor) |
1096 | | } |
1097 | | } |
1098 | | Some(other) => Err(serde::de::Error::invalid_type( |
1099 | | other.unexpected(), |
1100 | | &"tuple variant", |
1101 | | )), |
1102 | | None => Err(serde::de::Error::invalid_type( |
1103 | | Unexpected::UnitVariant, |
1104 | | &"tuple variant", |
1105 | | )), |
1106 | | } |
1107 | | } |
1108 | | |
1109 | | fn struct_variant<V>( |
1110 | | self, |
1111 | | _fields: &'static [&'static str], |
1112 | | visitor: V, |
1113 | | ) -> Result<V::Value, Error> |
1114 | | where |
1115 | | V: Visitor<'de>, |
1116 | | { |
1117 | | match self.value { |
1118 | | Some(Value::Object(v)) => v.deserialize_any(visitor), |
1119 | | Some(other) => Err(serde::de::Error::invalid_type( |
1120 | | other.unexpected(), |
1121 | | &"struct variant", |
1122 | | )), |
1123 | | None => Err(serde::de::Error::invalid_type( |
1124 | | Unexpected::UnitVariant, |
1125 | | &"struct variant", |
1126 | | )), |
1127 | | } |
1128 | | } |
1129 | | } |
1130 | | |
1131 | | struct SeqRefDeserializer<'de> { |
1132 | | iter: slice::Iter<'de, Value>, |
1133 | | } |
1134 | | |
1135 | | impl<'de> SeqRefDeserializer<'de> { |
1136 | | fn new(slice: &'de [Value]) -> Self { |
1137 | | SeqRefDeserializer { iter: slice.iter() } |
1138 | | } |
1139 | | } |
1140 | | |
1141 | | impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de> { |
1142 | | type Error = Error; |
1143 | | |
1144 | | fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> |
1145 | | where |
1146 | | T: DeserializeSeed<'de>, |
1147 | | { |
1148 | | match self.iter.next() { |
1149 | | Some(value) => seed.deserialize(value).map(Some), |
1150 | | None => Ok(None), |
1151 | | } |
1152 | | } |
1153 | | |
1154 | | fn size_hint(&self) -> Option<usize> { |
1155 | | match self.iter.size_hint() { |
1156 | | (lower, Some(upper)) if lower == upper => Some(upper), |
1157 | | _ => None, |
1158 | | } |
1159 | | } |
1160 | | } |
1161 | | |
1162 | | struct MapRefDeserializer<'de> { |
1163 | | iter: <&'de Map<String, Value> as IntoIterator>::IntoIter, |
1164 | | value: Option<&'de Value>, |
1165 | | } |
1166 | | |
1167 | | impl<'de> MapRefDeserializer<'de> { |
1168 | | fn new(map: &'de Map<String, Value>) -> Self { |
1169 | | MapRefDeserializer { |
1170 | | iter: map.into_iter(), |
1171 | | value: None, |
1172 | | } |
1173 | | } |
1174 | | } |
1175 | | |
1176 | | impl<'de> MapAccess<'de> for MapRefDeserializer<'de> { |
1177 | | type Error = Error; |
1178 | | |
1179 | | fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> |
1180 | | where |
1181 | | T: DeserializeSeed<'de>, |
1182 | | { |
1183 | | match self.iter.next() { |
1184 | | Some((key, value)) => { |
1185 | | self.value = Some(value); |
1186 | | let key_de = MapKeyDeserializer { |
1187 | | key: Cow::Borrowed(&**key), |
1188 | | }; |
1189 | | seed.deserialize(key_de).map(Some) |
1190 | | } |
1191 | | None => Ok(None), |
1192 | | } |
1193 | | } |
1194 | | |
1195 | | fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error> |
1196 | | where |
1197 | | T: DeserializeSeed<'de>, |
1198 | | { |
1199 | | match self.value.take() { |
1200 | | Some(value) => seed.deserialize(value), |
1201 | | None => Err(serde::de::Error::custom("value is missing")), |
1202 | | } |
1203 | | } |
1204 | | |
1205 | | fn size_hint(&self) -> Option<usize> { |
1206 | | match self.iter.size_hint() { |
1207 | | (lower, Some(upper)) if lower == upper => Some(upper), |
1208 | | _ => None, |
1209 | | } |
1210 | | } |
1211 | | } |
1212 | | |
1213 | | struct MapKeyDeserializer<'de> { |
1214 | | key: Cow<'de, str>, |
1215 | | } |
1216 | | |
1217 | | macro_rules! deserialize_numeric_key { |
1218 | | ($method:ident) => { |
1219 | | deserialize_numeric_key!($method, deserialize_number); |
1220 | | }; |
1221 | | |
1222 | | ($method:ident, $using:ident) => { |
1223 | | fn $method<V>(self, visitor: V) -> Result<V::Value, Error> |
1224 | | where |
1225 | | V: Visitor<'de>, |
1226 | | { |
1227 | | let mut de = crate::Deserializer::from_str(&self.key); |
1228 | | |
1229 | | match tri!(de.peek()) { |
1230 | | Some(b'0'..=b'9' | b'-') => {} |
1231 | | _ => return Err(Error::syntax(ErrorCode::ExpectedNumericKey, 0, 0)), |
1232 | | } |
1233 | | |
1234 | | let number = tri!(de.$using(visitor)); |
1235 | | |
1236 | | if tri!(de.peek()).is_some() { |
1237 | | return Err(Error::syntax(ErrorCode::ExpectedNumericKey, 0, 0)); |
1238 | | } |
1239 | | |
1240 | | Ok(number) |
1241 | | } |
1242 | | }; |
1243 | | } |
1244 | | |
1245 | | impl<'de> serde::Deserializer<'de> for MapKeyDeserializer<'de> { |
1246 | | type Error = Error; |
1247 | | |
1248 | | fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> |
1249 | | where |
1250 | | V: Visitor<'de>, |
1251 | | { |
1252 | | BorrowedCowStrDeserializer::new(self.key).deserialize_any(visitor) |
1253 | | } |
1254 | | |
1255 | | deserialize_numeric_key!(deserialize_i8); |
1256 | | deserialize_numeric_key!(deserialize_i16); |
1257 | | deserialize_numeric_key!(deserialize_i32); |
1258 | | deserialize_numeric_key!(deserialize_i64); |
1259 | | deserialize_numeric_key!(deserialize_u8); |
1260 | | deserialize_numeric_key!(deserialize_u16); |
1261 | | deserialize_numeric_key!(deserialize_u32); |
1262 | | deserialize_numeric_key!(deserialize_u64); |
1263 | | #[cfg(not(feature = "float_roundtrip"))] |
1264 | | deserialize_numeric_key!(deserialize_f32); |
1265 | | deserialize_numeric_key!(deserialize_f64); |
1266 | | |
1267 | | #[cfg(feature = "float_roundtrip")] |
1268 | | deserialize_numeric_key!(deserialize_f32, do_deserialize_f32); |
1269 | | deserialize_numeric_key!(deserialize_i128, do_deserialize_i128); |
1270 | | deserialize_numeric_key!(deserialize_u128, do_deserialize_u128); |
1271 | | |
1272 | | fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error> |
1273 | | where |
1274 | | V: Visitor<'de>, |
1275 | | { |
1276 | | if self.key == "true" { |
1277 | | visitor.visit_bool(true) |
1278 | | } else if self.key == "false" { |
1279 | | visitor.visit_bool(false) |
1280 | | } else { |
1281 | | Err(serde::de::Error::invalid_type( |
1282 | | Unexpected::Str(&self.key), |
1283 | | &visitor, |
1284 | | )) |
1285 | | } |
1286 | | } |
1287 | | |
1288 | | #[inline] |
1289 | | fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> |
1290 | | where |
1291 | | V: Visitor<'de>, |
1292 | | { |
1293 | | // Map keys cannot be null. |
1294 | | visitor.visit_some(self) |
1295 | | } |
1296 | | |
1297 | | #[inline] |
1298 | | fn deserialize_newtype_struct<V>( |
1299 | | self, |
1300 | | _name: &'static str, |
1301 | | visitor: V, |
1302 | | ) -> Result<V::Value, Error> |
1303 | | where |
1304 | | V: Visitor<'de>, |
1305 | | { |
1306 | | visitor.visit_newtype_struct(self) |
1307 | | } |
1308 | | |
1309 | | fn deserialize_enum<V>( |
1310 | | self, |
1311 | | name: &'static str, |
1312 | | variants: &'static [&'static str], |
1313 | | visitor: V, |
1314 | | ) -> Result<V::Value, Error> |
1315 | | where |
1316 | | V: Visitor<'de>, |
1317 | | { |
1318 | | self.key |
1319 | | .into_deserializer() |
1320 | | .deserialize_enum(name, variants, visitor) |
1321 | | } |
1322 | | |
1323 | | forward_to_deserialize_any! { |
1324 | | char str string bytes byte_buf unit unit_struct seq tuple tuple_struct |
1325 | | map struct identifier ignored_any |
1326 | | } |
1327 | | } |
1328 | | |
1329 | | struct KeyClassifier; |
1330 | | |
1331 | | enum KeyClass { |
1332 | | Map(String), |
1333 | | #[cfg(feature = "arbitrary_precision")] |
1334 | | Number, |
1335 | | #[cfg(feature = "raw_value")] |
1336 | | RawValue, |
1337 | | } |
1338 | | |
1339 | | impl<'de> DeserializeSeed<'de> for KeyClassifier { |
1340 | | type Value = KeyClass; |
1341 | | |
1342 | 8.68k | fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> |
1343 | 8.68k | where |
1344 | 8.68k | D: serde::Deserializer<'de>, |
1345 | | { |
1346 | 8.68k | deserializer.deserialize_str(self) |
1347 | 8.68k | } <serde_json::value::de::KeyClassifier as serde_core::de::DeserializeSeed>::deserialize::<serde_json::de::MapKey<serde_json::read::SliceRead>> Line | Count | Source | 1342 | 8.68k | fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> | 1343 | 8.68k | where | 1344 | 8.68k | D: serde::Deserializer<'de>, | 1345 | | { | 1346 | 8.68k | deserializer.deserialize_str(self) | 1347 | 8.68k | } |
Unexecuted instantiation: <serde_json::value::de::KeyClassifier as serde_core::de::DeserializeSeed>::deserialize::<serde_json::de::MapKey<serde_json::read::StrRead>> |
1348 | | } |
1349 | | |
1350 | | impl<'de> Visitor<'de> for KeyClassifier { |
1351 | | type Value = KeyClass; |
1352 | | |
1353 | | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
1354 | | formatter.write_str("a string key") |
1355 | | } |
1356 | | |
1357 | 8.40k | fn visit_str<E>(self, s: &str) -> Result<Self::Value, E> |
1358 | 8.40k | where |
1359 | 8.40k | E: de::Error, |
1360 | | { |
1361 | 8.40k | match s { |
1362 | | #[cfg(feature = "arbitrary_precision")] |
1363 | | crate::number::TOKEN => Ok(KeyClass::Number), |
1364 | | #[cfg(feature = "raw_value")] |
1365 | | crate::raw::TOKEN => Ok(KeyClass::RawValue), |
1366 | 8.40k | _ => Ok(KeyClass::Map(s.to_owned())), |
1367 | | } |
1368 | 8.40k | } |
1369 | | |
1370 | | #[cfg(any(feature = "std", feature = "alloc"))] |
1371 | | fn visit_string<E>(self, s: String) -> Result<Self::Value, E> |
1372 | | where |
1373 | | E: de::Error, |
1374 | | { |
1375 | | match s.as_str() { |
1376 | | #[cfg(feature = "arbitrary_precision")] |
1377 | | crate::number::TOKEN => Ok(KeyClass::Number), |
1378 | | #[cfg(feature = "raw_value")] |
1379 | | crate::raw::TOKEN => Ok(KeyClass::RawValue), |
1380 | | _ => Ok(KeyClass::Map(s)), |
1381 | | } |
1382 | | } |
1383 | | } |
1384 | | |
1385 | | impl Value { |
1386 | | #[cold] |
1387 | 0 | fn invalid_type<E>(&self, exp: &dyn Expected) -> E |
1388 | 0 | where |
1389 | 0 | E: serde::de::Error, |
1390 | | { |
1391 | 0 | serde::de::Error::invalid_type(self.unexpected(), exp) |
1392 | 0 | } |
1393 | | |
1394 | | #[cold] |
1395 | 0 | fn unexpected(&self) -> Unexpected { |
1396 | 0 | match self { |
1397 | 0 | Value::Null => Unexpected::Unit, |
1398 | 0 | Value::Bool(b) => Unexpected::Bool(*b), |
1399 | 0 | Value::Number(n) => n.unexpected(), |
1400 | 0 | Value::String(s) => Unexpected::Str(s), |
1401 | 0 | Value::Array(_) => Unexpected::Seq, |
1402 | 0 | Value::Object(_) => Unexpected::Map, |
1403 | | } |
1404 | 0 | } |
1405 | | } |
1406 | | |
1407 | | struct BorrowedCowStrDeserializer<'de> { |
1408 | | value: Cow<'de, str>, |
1409 | | } |
1410 | | |
1411 | | impl<'de> BorrowedCowStrDeserializer<'de> { |
1412 | | fn new(value: Cow<'de, str>) -> Self { |
1413 | | BorrowedCowStrDeserializer { value } |
1414 | | } |
1415 | | } |
1416 | | |
1417 | | impl<'de> de::Deserializer<'de> for BorrowedCowStrDeserializer<'de> { |
1418 | | type Error = Error; |
1419 | | |
1420 | | fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> |
1421 | | where |
1422 | | V: de::Visitor<'de>, |
1423 | | { |
1424 | | match self.value { |
1425 | | Cow::Borrowed(string) => visitor.visit_borrowed_str(string), |
1426 | | #[cfg(any(feature = "std", feature = "alloc"))] |
1427 | | Cow::Owned(string) => visitor.visit_string(string), |
1428 | | #[cfg(not(any(feature = "std", feature = "alloc")))] |
1429 | | Cow::Owned(_) => unreachable!(), |
1430 | | } |
1431 | | } |
1432 | | |
1433 | | fn deserialize_enum<V>( |
1434 | | self, |
1435 | | _name: &str, |
1436 | | _variants: &'static [&'static str], |
1437 | | visitor: V, |
1438 | | ) -> Result<V::Value, Error> |
1439 | | where |
1440 | | V: de::Visitor<'de>, |
1441 | | { |
1442 | | visitor.visit_enum(self) |
1443 | | } |
1444 | | |
1445 | | forward_to_deserialize_any! { |
1446 | | bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string |
1447 | | bytes byte_buf option unit unit_struct newtype_struct seq tuple |
1448 | | tuple_struct map struct identifier ignored_any |
1449 | | } |
1450 | | } |
1451 | | |
1452 | | impl<'de> de::EnumAccess<'de> for BorrowedCowStrDeserializer<'de> { |
1453 | | type Error = Error; |
1454 | | type Variant = UnitOnly; |
1455 | | |
1456 | | fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Error> |
1457 | | where |
1458 | | T: de::DeserializeSeed<'de>, |
1459 | | { |
1460 | | let value = tri!(seed.deserialize(self)); |
1461 | | Ok((value, UnitOnly)) |
1462 | | } |
1463 | | } |
1464 | | |
1465 | | struct UnitOnly; |
1466 | | |
1467 | | impl<'de> de::VariantAccess<'de> for UnitOnly { |
1468 | | type Error = Error; |
1469 | | |
1470 | | fn unit_variant(self) -> Result<(), Error> { |
1471 | | Ok(()) |
1472 | | } |
1473 | | |
1474 | | fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Error> |
1475 | | where |
1476 | | T: de::DeserializeSeed<'de>, |
1477 | | { |
1478 | | Err(de::Error::invalid_type( |
1479 | | Unexpected::UnitVariant, |
1480 | | &"newtype variant", |
1481 | | )) |
1482 | | } |
1483 | | |
1484 | | fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Error> |
1485 | | where |
1486 | | V: de::Visitor<'de>, |
1487 | | { |
1488 | | Err(de::Error::invalid_type( |
1489 | | Unexpected::UnitVariant, |
1490 | | &"tuple variant", |
1491 | | )) |
1492 | | } |
1493 | | |
1494 | | fn struct_variant<V>( |
1495 | | self, |
1496 | | _fields: &'static [&'static str], |
1497 | | _visitor: V, |
1498 | | ) -> Result<V::Value, Error> |
1499 | | where |
1500 | | V: de::Visitor<'de>, |
1501 | | { |
1502 | | Err(de::Error::invalid_type( |
1503 | | Unexpected::UnitVariant, |
1504 | | &"struct variant", |
1505 | | )) |
1506 | | } |
1507 | | } |