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