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