1use std::{borrow::Cow, collections::HashMap};
2
3use serde::{
4 de::{
5 value::{BorrowedStrDeserializer, BytesDeserializer},
6 DeserializeSeed, EnumAccess, Expected, IntoDeserializer, MapAccess, SeqAccess, Unexpected,
7 VariantAccess, Visitor,
8 },
9 forward_to_deserialize_any, Deserialize, Deserializer,
10};
11use serde_bytes::ByteBuf;
12
13use crate::{error::Error, ByteArray, IntArray, LongArray, Value};
14
15impl<'de> Deserialize<'de> for Value {
16 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
17 where
18 D: serde::Deserializer<'de>,
19 {
20 struct ValueVisitor;
21 impl<'de> serde::de::Visitor<'de> for ValueVisitor {
22 type Value = Value;
23
24 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
25 formatter.write_str("valid NBT")
26 }
27
28 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
29 where
30 E: serde::de::Error,
31 {
32 Ok(Value::Byte(v))
33 }
34
35 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
36 where
37 E: serde::de::Error,
38 {
39 Ok(Value::Short(v))
40 }
41
42 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
43 where
44 E: serde::de::Error,
45 {
46 Ok(Value::Int(v))
47 }
48
49 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
50 where
51 E: serde::de::Error,
52 {
53 Ok(Value::Long(v))
54 }
55
56 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
57 where
58 E: serde::de::Error,
59 {
60 Ok(Value::Float(v))
61 }
62
63 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
64 where
65 E: serde::de::Error,
66 {
67 Ok(Value::Double(v))
68 }
69
70 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
71 where
72 E: serde::de::Error,
73 {
74 Ok(Value::String(v.to_owned()))
75 }
76
77 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
78 where
79 A: serde::de::SeqAccess<'de>,
80 {
81 let mut v = Vec::<Value>::with_capacity(seq.size_hint().unwrap_or(0));
89
90 while let Some(el) = seq.next_element()? {
91 v.push(el);
92 }
93
94 Ok(Value::List(v))
95 }
96
97 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
98 where
99 A: serde::de::MapAccess<'de>,
100 {
101 match map.next_key_seed(KeyClassifier)? {
102 Some(KeyClass::Compound(first_key)) => {
103 let mut compound = HashMap::new();
104
105 compound.insert(first_key, map.next_value()?);
106 while let Some((key, value)) = map.next_entry()? {
107 compound.insert(key, value);
108 }
109
110 Ok(Value::Compound(compound))
111 }
112 Some(KeyClass::ByteArray) => {
113 let data = map.next_value::<ByteBuf>()?;
114 Ok(Value::ByteArray(ByteArray::from_buf(data.into_vec())))
115 }
116 Some(KeyClass::IntArray) => {
117 let data = map.next_value::<ByteBuf>()?;
118 IntArray::from_bytes(&data)
119 .map(Value::IntArray)
120 .map_err(|_| serde::de::Error::custom("could not read int array"))
121 }
122 Some(KeyClass::LongArray) => {
123 let data = map.next_value::<ByteBuf>()?;
124 LongArray::from_bytes(&data)
125 .map(Value::LongArray)
126 .map_err(|_| serde::de::Error::custom("could not read long array"))
127 }
128 None => Ok(Value::Compound(Default::default())),
130 }
131 }
132 }
133
134 deserializer.deserialize_any(ValueVisitor)
135 }
136}
137
138struct KeyClassifier;
139
140enum KeyClass {
141 Compound(String),
142 ByteArray,
143 IntArray,
144 LongArray,
145}
146
147impl<'de> DeserializeSeed<'de> for KeyClassifier {
148 type Value = KeyClass;
149
150 fn deserialize<D>(self, deserializer: D) -> Result<KeyClass, D::Error>
151 where
152 D: serde::Deserializer<'de>,
153 {
154 deserializer.deserialize_str(self)
155 }
156}
157
158impl<'de> Visitor<'de> for KeyClassifier {
159 type Value = KeyClass;
160
161 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
162 formatter.write_str("an nbt field string")
163 }
164
165 fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
166 where
167 E: serde::de::Error,
168 {
169 match s.as_str() {
170 crate::BYTE_ARRAY_TOKEN => Ok(KeyClass::ByteArray),
171 crate::INT_ARRAY_TOKEN => Ok(KeyClass::IntArray),
172 crate::LONG_ARRAY_TOKEN => Ok(KeyClass::LongArray),
173 _ => Ok(KeyClass::Compound(s)),
174 }
175 }
176
177 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
178 where
179 E: serde::de::Error,
180 {
181 match s {
182 crate::BYTE_ARRAY_TOKEN => Ok(KeyClass::ByteArray),
183 crate::INT_ARRAY_TOKEN => Ok(KeyClass::IntArray),
184 crate::LONG_ARRAY_TOKEN => Ok(KeyClass::LongArray),
185 _ => Ok(KeyClass::Compound(s.to_string())),
186 }
187 }
188}
189
190macro_rules! deserialize_number {
224 ($method:ident, $visit:ident, $primitive:ident, $variant:ident) => {
225 fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
226 where
227 V: Visitor<'de>,
228 {
229 match self {
230 Value::$variant(v) => visitor.$visit(*v as $primitive),
231 _ => Err(self.invalid_type(&visitor)),
232 }
233 }
234 };
235}
236
237fn visit_list<'de, V>(list: &'de Vec<Value>, visitor: V) -> Result<V::Value, Error>
238where
239 V: Visitor<'de>,
240{
241 let len = list.len();
242 let mut deserializer = SeqDeserializer::new(list);
243 let seq = visitor.visit_seq(&mut deserializer)?;
244 let remaining = deserializer.iter.len();
245 if remaining == 0 {
246 Ok(seq)
247 } else {
248 Err(serde::de::Error::invalid_length(
249 len,
250 &"fewer elements in list",
251 ))
252 }
253}
254
255fn visit_compound<'de, V>(
256 compound: &'de HashMap<String, Value>,
257 visitor: V,
258) -> Result<V::Value, Error>
259where
260 V: Visitor<'de>,
261{
262 let len = compound.len();
263 let mut deserializer = MapDeserializer::new(compound);
264 let map = visitor.visit_map(&mut deserializer)?;
265 let remaining = deserializer.iter.len();
266 if remaining == 0 {
267 Ok(map)
268 } else {
269 Err(serde::de::Error::invalid_length(
270 len,
271 &"fewer elements in map",
272 ))
273 }
274}
275
276fn get_i128_value(de: &Value) -> Result<i128, Error> {
277 match de {
278 Value::IntArray(v) => {
279 if v.len() != 4 {
280 Err(Error::bespoke(format!(
281 "deserialize i128: expected IntArray of length 4, got length {}",
282 v.len()
283 )))
284 } else {
285 Ok(v.iter()
286 .rev()
287 .flat_map(|n| (0..32).map(move |bit| n >> bit & 1))
288 .rev()
289 .fold(0, |acc, bit| acc << 1 | bit as i128))
290 }
291 }
292 v => Err(Error::bespoke(format!(
293 "deserialize i128: expected IntArray value {v:?}"
294 ))),
295 }
296}
297
298impl<'de> serde::Deserializer<'de> for &'de Value {
299 type Error = Error;
300
301 #[inline]
302 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
303 where
304 V: Visitor<'de>,
305 {
306 match *self {
307 Value::Byte(val) => visitor.visit_i8(val),
308 Value::Short(val) => visitor.visit_i16(val),
309 Value::Int(val) => visitor.visit_i32(val),
310 Value::Long(val) => visitor.visit_i64(val),
311 Value::Float(val) => visitor.visit_f32(val),
312 Value::Double(val) => visitor.visit_f64(val),
313 Value::String(ref val) => visitor.visit_borrowed_str(val),
314 Value::ByteArray(_) => visitor.visit_map(ArrayAccess {
315 token: crate::BYTE_ARRAY_TOKEN,
316 value: self,
317 }),
318 Value::IntArray(_) => visitor.visit_map(ArrayAccess {
319 token: crate::INT_ARRAY_TOKEN,
320 value: self,
321 }),
322 Value::LongArray(_) => visitor.visit_map(ArrayAccess {
323 token: crate::LONG_ARRAY_TOKEN,
324 value: self,
325 }),
326 Value::List(ref val) => visit_list(val, visitor),
327 Value::Compound(ref val) => visit_compound(val, visitor),
328 }
329 }
330
331 deserialize_number!(deserialize_i8, visit_i8, i8, Byte);
332 deserialize_number!(deserialize_i16, visit_i16, i16, Short);
333 deserialize_number!(deserialize_i32, visit_i32, i32, Int);
334 deserialize_number!(deserialize_i64, visit_i64, i64, Long);
335 deserialize_number!(deserialize_u8, visit_u8, u8, Byte);
336 deserialize_number!(deserialize_u16, visit_u16, u16, Short);
337 deserialize_number!(deserialize_u32, visit_u32, u32, Int);
338 deserialize_number!(deserialize_u64, visit_u64, u64, Long);
339 deserialize_number!(deserialize_f32, visit_f32, f32, Float);
340 deserialize_number!(deserialize_f64, visit_f64, f64, Double);
341
342 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
343 where
344 V: Visitor<'de>,
345 {
346 visitor.visit_i128(get_i128_value(self)?)
347 }
348
349 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
350 where
351 V: Visitor<'de>,
352 {
353 visitor.visit_u128(get_i128_value(self)? as u128)
354 }
355
356 #[inline]
357 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
358 where
359 V: Visitor<'de>,
360 {
361 visitor.visit_some(self)
362 }
363
364 #[inline]
365 fn deserialize_enum<V>(
366 self,
367 _name: &str,
368 _variants: &'static [&'static str],
369 visitor: V,
370 ) -> Result<V::Value, Error>
371 where
372 V: Visitor<'de>,
373 {
374 let (variant, value) = match self {
375 Value::Compound(value) => {
376 let mut iter = value.iter();
377 let (variant, value) = match iter.next() {
378 Some(v) => v,
379 None => {
380 return Err(serde::de::Error::invalid_value(
381 Unexpected::Map,
382 &"map with a single key",
383 ));
384 }
385 };
386 if iter.next().is_some() {
388 return Err(serde::de::Error::invalid_value(
389 Unexpected::Map,
390 &"map with a single key",
391 ));
392 }
393 (variant, Some(value))
394 }
395 Value::String(variant) => (variant, None),
396 other => {
397 return Err(serde::de::Error::invalid_type(
398 other.unexpected(),
399 &"string or map",
400 ));
401 }
402 };
403
404 visitor.visit_enum(EnumDeserializer { variant, value })
405 }
406
407 #[inline]
408 fn deserialize_newtype_struct<V>(
409 self,
410 _name: &'static str,
411 visitor: V,
412 ) -> Result<V::Value, Error>
413 where
414 V: Visitor<'de>,
415 {
416 visitor.visit_newtype_struct(self)
417 }
418
419 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
420 where
421 V: Visitor<'de>,
422 {
423 match self {
424 Value::Byte(v) => visitor.visit_bool(v != &0),
425 Value::Short(v) => visitor.visit_bool(v != &0),
426 Value::Int(v) => visitor.visit_bool(v != &0),
427 Value::Long(v) => visitor.visit_bool(v != &0),
428 _ => Err(self.invalid_type(&visitor)),
429 }
430 }
431
432 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
433 where
434 V: Visitor<'de>,
435 {
436 match self {
437 Value::Int(v) => match char::from_u32(*v as u32) {
438 Some(v) => visitor.visit_char(v),
439 None => Err(serde::de::Error::invalid_value(
440 self.unexpected(),
441 &"invalid character code",
442 )),
443 },
444 Value::String(ref v) => match v.chars().next() {
445 Some(v) => visitor.visit_char(v),
446 None => Err(serde::de::Error::invalid_value(
447 self.unexpected(),
448 &"string contains no character",
449 )),
450 },
451 _ => Err(self.invalid_type(&visitor)),
452 }
453 }
454
455 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
456 where
457 V: Visitor<'de>,
458 {
459 match self {
460 Value::String(v) => visitor.visit_borrowed_str(v),
461 _ => Err(self.invalid_type(&visitor)),
462 }
463 }
464
465 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
466 where
467 V: Visitor<'de>,
468 {
469 self.deserialize_str(visitor)
470 }
471
472 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
473 where
474 V: Visitor<'de>,
475 {
476 self.deserialize_byte_buf(visitor)
477 }
478
479 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
480 where
481 V: Visitor<'de>,
482 {
483 match self {
484 Value::String(v) => visitor.visit_borrowed_str(v),
485 Value::List(v) => visit_list(v, visitor),
486 _ => Err(self.invalid_type(&visitor)),
487 }
488 }
489
490 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
491 where
492 V: Visitor<'de>,
493 {
494 match self {
495 Value::List(v) => visit_list(v, visitor),
496 _ => Err(self.invalid_type(&visitor)),
497 }
498 }
499
500 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
501 where
502 V: Visitor<'de>,
503 {
504 self.deserialize_seq(visitor)
505 }
506
507 fn deserialize_tuple_struct<V>(
508 self,
509 _name: &'static str,
510 _len: usize,
511 visitor: V,
512 ) -> Result<V::Value, Error>
513 where
514 V: Visitor<'de>,
515 {
516 self.deserialize_seq(visitor)
517 }
518
519 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
520 where
521 V: Visitor<'de>,
522 {
523 self.deserialize_any(visitor)
524 }
525
526 fn deserialize_struct<V>(
527 self,
528 _name: &'static str,
529 _fields: &'static [&'static str],
530 visitor: V,
531 ) -> Result<V::Value, Error>
532 where
533 V: Visitor<'de>,
534 {
535 match self {
536 Value::List(v) => visit_list(v, visitor),
537 Value::Compound(v) => visit_compound(v, visitor),
538 _ => Err(self.invalid_type(&visitor)),
539 }
540 }
541
542 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
543 where
544 V: Visitor<'de>,
545 {
546 self.deserialize_string(visitor)
547 }
548
549 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
550 where
551 V: Visitor<'de>,
552 {
553 visitor.visit_unit()
554 }
555
556 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
557 where
558 V: Visitor<'de>,
559 {
560 visitor.visit_unit()
561 }
562
563 fn deserialize_unit_struct<V>(
564 self,
565 _name: &'static str,
566 visitor: V,
567 ) -> Result<V::Value, Self::Error>
568 where
569 V: Visitor<'de>,
570 {
571 visitor.visit_unit()
572 }
573}
574
575pub struct ArrayAccess<'de> {
576 pub token: &'static str,
577 pub value: &'de Value,
578}
579impl<'de> MapAccess<'de> for ArrayAccess<'de> {
580 type Error = Error;
581
582 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
583 where
584 K: DeserializeSeed<'de>,
585 {
586 seed.deserialize(BorrowedStrDeserializer::new(self.token))
587 .map(Some)
588 }
589
590 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
591 where
592 V: DeserializeSeed<'de>,
593 {
594 let data = match self.value {
595 Value::ByteArray(v) => v.to_bytes(),
596 Value::IntArray(v) => v.to_bytes(),
597 Value::LongArray(v) => v.to_bytes(),
598 _ => unreachable!(),
599 };
600 let dz = BytesDeserializer::new(&data);
601 seed.deserialize(dz)
602 }
603}
604
605struct EnumDeserializer<'de> {
606 variant: &'de str,
607 value: Option<&'de Value>,
608}
609
610impl<'de> EnumAccess<'de> for EnumDeserializer<'de> {
611 type Error = Error;
612 type Variant = VariantDeserializer<'de>;
613
614 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
615 where
616 V: DeserializeSeed<'de>,
617 {
618 let variant = self.variant.into_deserializer();
619 let visitor = VariantDeserializer { value: self.value };
620 seed.deserialize(variant).map(|v| (v, visitor))
621 }
622}
623
624impl<'de> IntoDeserializer<'de, Error> for &'de Value {
625 type Deserializer = Self;
626
627 fn into_deserializer(self) -> Self::Deserializer {
628 self
629 }
630}
631
632struct VariantDeserializer<'de> {
633 value: Option<&'de Value>,
634}
635
636impl<'de> VariantAccess<'de> for VariantDeserializer<'de> {
637 type Error = Error;
638
639 fn unit_variant(self) -> Result<(), Error> {
640 match self.value {
641 Some(value) => serde::Deserialize::deserialize(value),
642 None => Ok(()),
643 }
644 }
645
646 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
647 where
648 T: DeserializeSeed<'de>,
649 {
650 match self.value {
651 Some(value) => seed.deserialize(value),
652 None => Err(serde::de::Error::invalid_type(
653 Unexpected::UnitVariant,
654 &"newtype variant",
655 )),
656 }
657 }
658
659 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
660 where
661 V: Visitor<'de>,
662 {
663 match self.value {
664 Some(Value::List(v)) => {
665 if v.is_empty() {
666 visitor.visit_unit()
667 } else {
668 visit_list(v, visitor)
669 }
670 }
671 Some(other) => Err(serde::de::Error::invalid_type(
672 other.unexpected(),
673 &"tuple variant",
674 )),
675 None => Err(serde::de::Error::invalid_type(
676 Unexpected::UnitVariant,
677 &"tuple variant",
678 )),
679 }
680 }
681
682 fn struct_variant<V>(
683 self,
684 _fields: &'static [&'static str],
685 visitor: V,
686 ) -> Result<V::Value, Error>
687 where
688 V: Visitor<'de>,
689 {
690 match self.value {
691 Some(Value::Compound(v)) => visit_compound(v, visitor),
692 Some(other) => Err(serde::de::Error::invalid_type(
693 other.unexpected(),
694 &"struct variant",
695 )),
696 None => Err(serde::de::Error::invalid_type(
697 Unexpected::UnitVariant,
698 &"struct variant",
699 )),
700 }
701 }
702}
703
704struct SeqDeserializer<'de> {
705 iter: std::slice::Iter<'de, Value>,
706}
707
708impl<'de> SeqDeserializer<'de> {
709 fn new(slice: &'de [Value]) -> Self {
710 SeqDeserializer { iter: slice.iter() }
711 }
712}
713
714impl<'de> SeqAccess<'de> for SeqDeserializer<'de> {
715 type Error = Error;
716
717 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
718 where
719 T: DeserializeSeed<'de>,
720 {
721 match self.iter.next() {
722 Some(value) => seed.deserialize(value).map(Some),
723 None => Ok(None),
724 }
725 }
726
727 fn size_hint(&self) -> Option<usize> {
728 match self.iter.size_hint() {
729 (lower, Some(upper)) if lower == upper => Some(upper),
730 _ => None,
731 }
732 }
733}
734
735struct MapDeserializer<'de> {
736 iter: <&'de HashMap<String, Value> as IntoIterator>::IntoIter,
737 value: Option<&'de Value>,
738}
739
740impl<'de> MapDeserializer<'de> {
741 fn new(map: &'de HashMap<String, Value>) -> Self {
742 MapDeserializer {
743 iter: map.iter(),
744 value: None,
745 }
746 }
747}
748
749impl<'de> MapAccess<'de> for MapDeserializer<'de> {
750 type Error = Error;
751
752 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
753 where
754 T: DeserializeSeed<'de>,
755 {
756 match self.iter.next() {
757 Some((key, value)) => {
758 self.value = Some(value);
759 let key_de = MapKeyDeserializer {
760 key: Cow::Borrowed(&**key),
761 };
762 seed.deserialize(key_de).map(Some)
763 }
764 None => Ok(None),
765 }
766 }
767
768 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
769 where
770 T: DeserializeSeed<'de>,
771 {
772 match self.value.take() {
773 Some(value) => seed.deserialize(value),
774 None => Err(serde::de::Error::custom("value is missing")),
775 }
776 }
777
778 fn size_hint(&self) -> Option<usize> {
779 match self.iter.size_hint() {
780 (lower, Some(upper)) if lower == upper => Some(upper),
781 _ => None,
782 }
783 }
784}
785
786struct MapKeyDeserializer<'de> {
787 key: Cow<'de, str>,
788}
789
790macro_rules! deserialize_integer_key {
791 ($method:ident => $visit:ident) => {
792 fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
793 where
794 V: Visitor<'de>,
795 {
796 match (self.key.parse(), self.key) {
797 (Ok(integer), _) => visitor.$visit(integer),
798 (Err(_), Cow::Borrowed(s)) => visitor.visit_borrowed_str(s),
799 (Err(_), Cow::Owned(s)) => visitor.visit_string(s),
800 }
801 }
802 };
803}
804
805impl<'de> serde::Deserializer<'de> for MapKeyDeserializer<'de> {
806 type Error = Error;
807
808 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
809 where
810 V: Visitor<'de>,
811 {
812 BorrowedCowStrDeserializer::new(self.key).deserialize_any(visitor)
813 }
814
815 deserialize_integer_key!(deserialize_i8 => visit_i8);
816 deserialize_integer_key!(deserialize_i16 => visit_i16);
817 deserialize_integer_key!(deserialize_i32 => visit_i32);
818 deserialize_integer_key!(deserialize_i64 => visit_i64);
819 deserialize_integer_key!(deserialize_u8 => visit_u8);
820 deserialize_integer_key!(deserialize_u16 => visit_u16);
821 deserialize_integer_key!(deserialize_u32 => visit_u32);
822 deserialize_integer_key!(deserialize_u64 => visit_u64);
823 deserialize_integer_key!(deserialize_i128 => visit_i128);
824 deserialize_integer_key!(deserialize_u128 => visit_u128);
825
826 #[inline]
827 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
828 where
829 V: Visitor<'de>,
830 {
831 visitor.visit_some(self)
833 }
834
835 #[inline]
836 fn deserialize_newtype_struct<V>(
837 self,
838 _name: &'static str,
839 visitor: V,
840 ) -> Result<V::Value, Error>
841 where
842 V: Visitor<'de>,
843 {
844 visitor.visit_newtype_struct(self)
845 }
846
847 fn deserialize_enum<V>(
848 self,
849 name: &'static str,
850 variants: &'static [&'static str],
851 visitor: V,
852 ) -> Result<V::Value, Error>
853 where
854 V: Visitor<'de>,
855 {
856 self.key
857 .into_deserializer()
858 .deserialize_enum(name, variants, visitor)
859 }
860
861 forward_to_deserialize_any! {
862 bool f32 f64 char str string bytes byte_buf unit unit_struct seq tuple
863 tuple_struct map struct identifier ignored_any
864 }
865}
866
867impl Value {
868 #[cold]
869 fn invalid_type<E>(&self, exp: &dyn Expected) -> E
870 where
871 E: serde::de::Error,
872 {
873 serde::de::Error::invalid_type(self.unexpected(), exp)
874 }
875
876 #[cold]
877 fn unexpected(&self) -> Unexpected<'_> {
878 match self {
879 Value::Byte(v) => Unexpected::Signed(*v as i64),
880 Value::Short(v) => Unexpected::Signed(*v as i64),
881 Value::Int(v) => Unexpected::Signed(*v as i64),
882 Value::Long(v) => Unexpected::Signed(*v),
883 Value::Float(v) => Unexpected::Float(*v as f64),
884 Value::Double(v) => Unexpected::Float(*v),
885 Value::String(v) => Unexpected::Str(v),
886 Value::ByteArray(_) => Unexpected::Seq,
887 Value::IntArray(_) => Unexpected::Seq,
888 Value::LongArray(_) => Unexpected::Seq,
889 Value::List(_) => Unexpected::Seq,
890 Value::Compound(_) => Unexpected::Map,
891 }
892 }
893}
894
895struct BorrowedCowStrDeserializer<'de> {
896 value: Cow<'de, str>,
897}
898
899impl<'de> BorrowedCowStrDeserializer<'de> {
900 fn new(value: Cow<'de, str>) -> Self {
901 BorrowedCowStrDeserializer { value }
902 }
903}
904
905impl<'de> Deserializer<'de> for BorrowedCowStrDeserializer<'de> {
906 type Error = Error;
907
908 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
909 where
910 V: Visitor<'de>,
911 {
912 match self.value {
913 Cow::Borrowed(string) => visitor.visit_borrowed_str(string),
914 Cow::Owned(string) => visitor.visit_string(string),
915 }
916 }
917
918 fn deserialize_enum<V>(
919 self,
920 _name: &str,
921 _variants: &'static [&'static str],
922 visitor: V,
923 ) -> Result<V::Value, Error>
924 where
925 V: Visitor<'de>,
926 {
927 visitor.visit_enum(self)
928 }
929
930 forward_to_deserialize_any! {
931 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
932 bytes byte_buf option unit unit_struct newtype_struct seq tuple
933 tuple_struct map struct identifier ignored_any
934 }
935}
936
937impl<'de> EnumAccess<'de> for BorrowedCowStrDeserializer<'de> {
938 type Error = Error;
939 type Variant = UnitOnly;
940
941 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Error>
942 where
943 T: DeserializeSeed<'de>,
944 {
945 let value = seed.deserialize(self)?;
946 Ok((value, UnitOnly))
947 }
948}
949
950struct UnitOnly;
951
952impl<'de> VariantAccess<'de> for UnitOnly {
953 type Error = Error;
954
955 fn unit_variant(self) -> Result<(), Error> {
956 Ok(())
957 }
958
959 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Error>
960 where
961 T: DeserializeSeed<'de>,
962 {
963 Err(serde::de::Error::invalid_type(
964 Unexpected::UnitVariant,
965 &"newtype variant",
966 ))
967 }
968
969 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Error>
970 where
971 V: Visitor<'de>,
972 {
973 Err(serde::de::Error::invalid_type(
974 Unexpected::UnitVariant,
975 &"tuple variant",
976 ))
977 }
978
979 fn struct_variant<V>(
980 self,
981 _fields: &'static [&'static str],
982 _visitor: V,
983 ) -> Result<V::Value, Error>
984 where
985 V: Visitor<'de>,
986 {
987 Err(serde::de::Error::invalid_type(
988 Unexpected::UnitVariant,
989 &"struct variant",
990 ))
991 }
992}