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