Skip to main content

fastnbt/value/
de.rs

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                // I think I either need to do the same trick as I did for NBT
82                // Arrays and have dedicated types to this, or just accept that
83                // it's a Vec<Value> and that you can construct invalid NBT with
84                // it (by adding values of different type).
85
86                // Feel like the case of list of lists will break me if I try
87                // the dedicated type.
88                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                    // No keys just means an empty compound.
129                    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
190/* ---------- Deserializer ---------- */
191
192//
193// Everything below is copied and modified from serde_json:
194// https://github.com/serde-rs/json/blob/52a9c050f5dcc0dc3de4825b131b8ff05219cc82/src/value/de.rs
195//
196// For which the license is MIT:
197//
198// Permission is hereby granted, free of charge, to any
199// person obtaining a copy of this software and associated
200// documentation files (the "Software"), to deal in the
201// Software without restriction, including without
202// limitation the rights to use, copy, modify, merge,
203// publish, distribute, sublicense, and/or sell copies of
204// the Software, and to permit persons to whom the Software
205// is furnished to do so, subject to the following
206// conditions:
207//
208// The above copyright notice and this permission notice
209// shall be included in all copies or substantial portions
210// of the Software.
211//
212// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
213// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
214// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
215// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
216// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
217// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
218// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
219// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
220// DEALINGS IN THE SOFTWARE.
221//
222
223macro_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                // enums are encoded in nbt as maps with a single key:value pair
387                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        // Map keys cannot be null.
832        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}