simd_json/serde/value/borrowed/
de.rs

1// A lot of this logic is a re-implementation or copy of serde_json::Value
2use crate::Error;
3use crate::ObjectHasher;
4use crate::{cow::Cow, ErrorType};
5use crate::{
6    prelude::*,
7    serde::value::shared::MapKeyDeserializer,
8    value::borrowed::{Object, Value},
9};
10use serde_ext::{
11    de::{
12        self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, IntoDeserializer, MapAccess,
13        SeqAccess, VariantAccess, Visitor,
14    },
15    forward_to_deserialize_any,
16};
17use std::fmt;
18
19impl<'de> de::Deserializer<'de> for Value<'de> {
20    type Error = Error;
21
22    // Look at the input data to decide what Serde data model type to
23    // deserialize as. Not all data formats are able to support this operation.
24    // Formats that support `deserialize_any` are known as self-describing.
25    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
26    where
27        V: Visitor<'de>,
28    {
29        match self {
30            Value::Static(StaticNode::Null) => visitor.visit_unit(),
31            Value::Static(StaticNode::Bool(b)) => visitor.visit_bool(b),
32            Value::Static(StaticNode::I64(n)) => visitor.visit_i64(n),
33            #[cfg(feature = "128bit")]
34            Value::Static(StaticNode::I128(n)) => visitor.visit_i128(n),
35            Value::Static(StaticNode::U64(n)) => visitor.visit_u64(n),
36            #[cfg(feature = "128bit")]
37            Value::Static(StaticNode::U128(n)) => visitor.visit_u128(n),
38            #[allow(clippy::useless_conversion)] // .into() required by ordered-float
39            Value::Static(StaticNode::F64(n)) => visitor.visit_f64(n.into()),
40            #[cfg(feature = "beef")]
41            Value::String(s) => {
42                if s.is_borrowed() {
43                    visitor.visit_borrowed_str(s.unwrap_borrowed())
44                } else {
45                    visitor.visit_string(s.into_owned())
46                }
47            }
48            #[cfg(not(feature = "beef"))]
49            Value::String(s) => match s {
50                Cow::Borrowed(s) => visitor.visit_borrowed_str(s),
51                Cow::Owned(s) => visitor.visit_string(s),
52            },
53
54            Value::Array(a) => visitor.visit_seq(Array(a.into_iter())),
55            Value::Object(o) => visitor.visit_map(ObjectAccess::new(o.into_iter())),
56        }
57    }
58
59    #[cfg_attr(not(feature = "no-inline"), inline)]
60    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
61    where
62        V: Visitor<'de>,
63    {
64        if self == Value::Static(StaticNode::Null) {
65            visitor.visit_unit()
66        } else {
67            visitor.visit_some(self)
68        }
69    }
70
71    #[cfg_attr(not(feature = "no-inline"), inline)]
72    fn deserialize_enum<V>(
73        self,
74        _name: &str,
75        _variants: &'static [&'static str],
76        visitor: V,
77    ) -> Result<V::Value, Error>
78    where
79        V: Visitor<'de>,
80    {
81        let (variant, value) = match self {
82            Value::Object(value) => {
83                let mut iter = value.into_iter();
84                let (variant, value) = match iter.next() {
85                    Some(v) => v,
86                    None => {
87                        return Err(crate::Deserializer::error(ErrorType::Eof));
88                    }
89                };
90                // enums are encoded in json as maps with a single key:value pair
91                if iter.next().is_some() {
92                    return Err(crate::Deserializer::error(ErrorType::TrailingData));
93                }
94                (variant, Some(value))
95            }
96            Value::String(variant) => (variant, None),
97            other => {
98                return Err(crate::Deserializer::error(ErrorType::Unexpected(
99                    Some(ValueType::Object),
100                    Some(other.value_type()),
101                )));
102            }
103        };
104
105        visitor.visit_enum(EnumDeserializer { variant, value })
106    }
107
108    #[cfg_attr(not(feature = "no-inline"), inline)]
109    fn deserialize_newtype_struct<V>(
110        self,
111        _name: &'static str,
112        visitor: V,
113    ) -> Result<V::Value, Error>
114    where
115        V: Visitor<'de>,
116    {
117        visitor.visit_newtype_struct(self)
118    }
119
120    #[cfg_attr(not(feature = "no-inline"), inline)]
121    fn deserialize_struct<V>(
122        self,
123        _name: &'static str,
124        _fields: &'static [&'static str],
125        visitor: V,
126    ) -> Result<V::Value, Error>
127    where
128        V: Visitor<'de>,
129    {
130        match self {
131            // Give the visitor access to each element of the sequence.
132            Value::Array(a) => visitor.visit_seq(Array(a.into_iter())),
133            Value::Object(o) => visitor.visit_map(ObjectAccess::new(o.into_iter())),
134            other => Err(crate::Deserializer::error(ErrorType::Unexpected(
135                Some(ValueType::Object),
136                Some(other.value_type()),
137            ))),
138        }
139    }
140
141    forward_to_deserialize_any! {
142        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
143            bytes byte_buf unit unit_struct seq tuple
144            tuple_struct map identifier ignored_any
145    }
146}
147
148struct Array<'de>(std::vec::IntoIter<Value<'de>>);
149
150// `SeqAccess` is provided to the `Visitor` to give it the ability to iterate
151// through elements of the sequence.
152impl<'de> SeqAccess<'de> for Array<'de> {
153    type Error = Error;
154
155    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
156    where
157        T: DeserializeSeed<'de>,
158    {
159        self.0
160            .next()
161            .map_or(Ok(None), |v| seed.deserialize(v).map(Some))
162    }
163}
164
165struct ArrayRef<'de>(std::slice::Iter<'de, Value<'de>>);
166
167// `SeqAccess` is provided to the `Visitor` to give it the ability to iterate
168// through elements of the sequence.
169impl<'de> SeqAccess<'de> for ArrayRef<'de> {
170    type Error = Error;
171
172    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
173    where
174        T: DeserializeSeed<'de>,
175    {
176        self.0
177            .next()
178            .map_or(Ok(None), |v| seed.deserialize(v).map(Some))
179    }
180}
181
182struct ObjectAccess<'de, const N: usize = 32> {
183    i: halfbrown::IntoIter<Cow<'de, str>, Value<'de>, N>,
184    v: Option<Value<'de>>,
185}
186
187impl<'de, const N: usize> ObjectAccess<'de, N> {
188    fn new(i: halfbrown::IntoIter<Cow<'de, str>, Value<'de>, N>) -> Self {
189        Self { i, v: None }
190    }
191}
192
193// `MapAccess` is provided to the `Visitor` to give it the ability to iterate
194// through entries of the map.
195impl<'de> MapAccess<'de> for ObjectAccess<'de> {
196    type Error = Error;
197
198    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
199    where
200        K: DeserializeSeed<'de>,
201    {
202        if let Some((k, v)) = self.i.next() {
203            self.v = Some(v);
204            seed.deserialize(Value::String(k)).map(Some)
205        } else {
206            Ok(None)
207        }
208    }
209
210    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
211    where
212        V: DeserializeSeed<'de>,
213    {
214        match self.v.take() {
215            Some(v) => seed.deserialize(v),
216            None => Err(crate::Deserializer::error(ErrorType::Eof)),
217        }
218    }
219}
220
221struct ObjectRefAccess<'de> {
222    i: halfbrown::Iter<'de, Cow<'de, str>, Value<'de>>,
223    v: Option<&'de Value<'de>>,
224}
225impl<'de> ObjectRefAccess<'de> {
226    fn new(i: halfbrown::Iter<'de, Cow<'de, str>, Value<'de>>) -> Self {
227        Self { i, v: None }
228    }
229}
230
231// `MapAccess` is provided to the `Visitor` to give it the ability to iterate
232// through entries of the map.
233impl<'de> MapAccess<'de> for ObjectRefAccess<'de> {
234    type Error = Error;
235
236    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
237    where
238        K: DeserializeSeed<'de>,
239    {
240        if let Some((k, v)) = self.i.next() {
241            self.v = Some(v);
242            let s: &str = k;
243            seed.deserialize(MapKeyDeserializer::borrowed(s)).map(Some)
244        } else {
245            Ok(None)
246        }
247    }
248
249    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
250    where
251        V: DeserializeSeed<'de>,
252    {
253        match self.v.take() {
254            Some(v) => seed.deserialize(v),
255            None => Err(crate::Deserializer::error(ErrorType::Eof)),
256        }
257    }
258}
259
260impl<'de> Deserialize<'de> for Value<'de> {
261    fn deserialize<D>(deserializer: D) -> Result<Value<'de>, D::Error>
262    where
263        D: Deserializer<'de>,
264    {
265        deserializer.deserialize_any(ValueVisitor)
266    }
267}
268
269struct ValueVisitor;
270
271impl<'de> Visitor<'de> for ValueVisitor {
272    type Value = Value<'de>;
273
274    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
275        formatter.write_str("an JSONesque value")
276    }
277
278    /****************** unit ******************/
279    #[cfg_attr(not(feature = "no-inline"), inline)]
280    fn visit_unit<E>(self) -> Result<Self::Value, E> {
281        Ok(Value::Static(StaticNode::Null))
282    }
283
284    /****************** bool ******************/
285    #[cfg_attr(not(feature = "no-inline"), inline)]
286    fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E> {
287        Ok(Value::Static(StaticNode::Bool(value)))
288    }
289
290    /****************** Option ******************/
291    #[cfg_attr(not(feature = "no-inline"), inline)]
292    fn visit_none<E>(self) -> Result<Self::Value, E> {
293        Ok(Value::Static(StaticNode::Null))
294    }
295
296    #[cfg_attr(not(feature = "no-inline"), inline)]
297    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
298    where
299        D: Deserializer<'de>,
300    {
301        deserializer.deserialize_any(self)
302    }
303
304    /****************** enum ******************/
305    /*
306    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> where
307        A: EnumAccess<'de>,
308    {
309    }
310     */
311
312    /****************** i64 ******************/
313    #[cfg_attr(not(feature = "no-inline"), inline)]
314    fn visit_i8<E>(self, value: i8) -> Result<Self::Value, E>
315    where
316        E: de::Error,
317    {
318        Ok(Value::Static(StaticNode::I64(i64::from(value))))
319    }
320
321    #[cfg_attr(not(feature = "no-inline"), inline)]
322    fn visit_i16<E>(self, value: i16) -> Result<Self::Value, E>
323    where
324        E: de::Error,
325    {
326        Ok(Value::Static(StaticNode::I64(i64::from(value))))
327    }
328
329    #[cfg_attr(not(feature = "no-inline"), inline)]
330    fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E>
331    where
332        E: de::Error,
333    {
334        Ok(Value::Static(StaticNode::I64(i64::from(value))))
335    }
336
337    #[cfg_attr(not(feature = "no-inline"), inline)]
338    fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
339    where
340        E: de::Error,
341    {
342        Ok(Value::Static(StaticNode::I64(value)))
343    }
344
345    #[cfg(feature = "128bit")]
346    #[cfg_attr(not(feature = "no-inline"), inline)]
347    fn visit_i128<E>(self, value: i128) -> Result<Self::Value, E>
348    where
349        E: de::Error,
350    {
351        Ok(Value::Static(StaticNode::I128(value)))
352    }
353
354    /****************** u64 ******************/
355
356    #[cfg_attr(not(feature = "no-inline"), inline)]
357    fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
358    where
359        E: de::Error,
360    {
361        Ok(Value::Static(StaticNode::U64(u64::from(value))))
362    }
363
364    #[cfg_attr(not(feature = "no-inline"), inline)]
365    fn visit_u16<E>(self, value: u16) -> Result<Self::Value, E>
366    where
367        E: de::Error,
368    {
369        Ok(Value::Static(StaticNode::U64(u64::from(value))))
370    }
371
372    #[cfg_attr(not(feature = "no-inline"), inline)]
373    fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
374    where
375        E: de::Error,
376    {
377        Ok(Value::Static(StaticNode::U64(u64::from(value))))
378    }
379
380    #[cfg_attr(not(feature = "no-inline"), inline)]
381    fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
382    where
383        E: de::Error,
384    {
385        Ok(Value::Static(StaticNode::U64(value)))
386    }
387
388    #[cfg(feature = "128bit")]
389    #[cfg_attr(not(feature = "no-inline"), inline)]
390    fn visit_u128<E>(self, value: u128) -> Result<Self::Value, E>
391    where
392        E: de::Error,
393    {
394        Ok(Value::Static(StaticNode::U128(value)))
395    }
396
397    /****************** f64 ******************/
398
399    #[cfg_attr(not(feature = "no-inline"), inline)]
400    fn visit_f32<E>(self, value: f32) -> Result<Self::Value, E>
401    where
402        E: de::Error,
403    {
404        Ok(Value::Static(StaticNode::from(f64::from(value))))
405    }
406
407    #[cfg_attr(not(feature = "no-inline"), inline)]
408    fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E>
409    where
410        E: de::Error,
411    {
412        Ok(Value::Static(StaticNode::from(value)))
413    }
414
415    /****************** stringy stuff ******************/
416    #[cfg_attr(not(feature = "no-inline"), inline)]
417    fn visit_char<E>(self, value: char) -> Result<Self::Value, E>
418    where
419        E: de::Error,
420    {
421        Ok(Value::from(value.to_string()))
422    }
423
424    #[cfg_attr(not(feature = "no-inline"), inline)]
425    fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
426    where
427        E: de::Error,
428    {
429        Ok(Value::from(value))
430    }
431
432    #[cfg_attr(not(feature = "no-inline"), inline)]
433    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
434    where
435        E: de::Error,
436    {
437        Ok(Value::String(value.to_owned().into()))
438    }
439
440    #[cfg_attr(not(feature = "no-inline"), inline)]
441    fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
442    where
443        E: de::Error,
444    {
445        Ok(Value::String(value.into()))
446    }
447
448    /****************** byte stuff ******************/
449
450    /*
451    #[cfg_attr(not(feature = "no-inline"), inline)]
452    fn visit_borrowed_bytes<E>(self, value: &'de [u8]) -> Result<Self::Value, E>
453    where
454        E: de::Error,
455    {
456        Ok(Value::String(value))
457    }
458
459    #[cfg_attr(not(feature = "no-inline"), inline)]
460    fn visit_str<E>(self, value: &[u8]) -> Result<Self::Value, E>
461    where
462    'a: 'de
463        E: de::Error,
464    {
465      Ok(Value::String(value))
466    }
467
468    #[cfg_attr(not(feature = "no-inline"), inline)]
469    fn visit_string<E>(self, value: Vec<u8>) -> Result<Self::Value, E>
470    where
471        E: de::Error,
472    {
473      Ok(Value::String(&value))
474    }
475     */
476    /****************** nexted stuff ******************/
477    #[cfg_attr(not(feature = "no-inline"), inline)]
478    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
479    where
480        A: MapAccess<'de>,
481    {
482        let size = map.size_hint().unwrap_or_default();
483
484        let mut m = Object::with_capacity_and_hasher(size, ObjectHasher::default());
485        while let Some(k) = map.next_key::<&str>()? {
486            let v = map.next_value()?;
487            m.insert(k.into(), v);
488        }
489        Ok(Value::from(m))
490    }
491
492    #[cfg_attr(not(feature = "no-inline"), inline)]
493    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
494    where
495        A: SeqAccess<'de>,
496    {
497        let size = seq.size_hint().unwrap_or_default();
498
499        let mut v = Vec::with_capacity(size);
500        while let Some(e) = seq.next_element()? {
501            v.push(e);
502        }
503        Ok(Value::Array(Box::new(v)))
504    }
505}
506
507struct EnumDeserializer<'de> {
508    variant: Cow<'de, str>,
509    value: Option<Value<'de>>,
510}
511
512impl<'de> EnumAccess<'de> for EnumDeserializer<'de> {
513    type Error = Error;
514    type Variant = VariantDeserializer<'de>;
515
516    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer<'de>), Error>
517    where
518        V: DeserializeSeed<'de>,
519    {
520        let variant = self.variant.into_deserializer();
521        let visitor = VariantDeserializer { value: self.value };
522        seed.deserialize(variant).map(|v| (v, visitor))
523    }
524}
525
526impl<'de> IntoDeserializer<'de, Error> for Value<'de> {
527    type Deserializer = Self;
528
529    fn into_deserializer(self) -> Self::Deserializer {
530        self
531    }
532}
533
534struct VariantDeserializer<'de> {
535    value: Option<Value<'de>>,
536}
537
538impl<'de> VariantAccess<'de> for VariantDeserializer<'de> {
539    type Error = Error;
540
541    fn unit_variant(self) -> Result<(), Error> {
542        match self.value {
543            Some(value) => Deserialize::deserialize(value),
544            None => Ok(()),
545        }
546    }
547
548    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
549    where
550        T: DeserializeSeed<'de>,
551    {
552        match self.value {
553            Some(value) => seed.deserialize(value),
554            None => Err(crate::Deserializer::error(ErrorType::Unexpected(
555                Some(ValueType::Object),
556                None,
557            ))),
558        }
559    }
560
561    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
562    where
563        V: Visitor<'de>,
564    {
565        match self.value {
566            Some(Value::Array(v)) => {
567                if v.is_empty() {
568                    visitor.visit_unit()
569                } else {
570                    visitor.visit_seq(Array(v.into_iter()))
571                }
572            }
573            Some(other) => Err(crate::Deserializer::error(ErrorType::Unexpected(
574                Some(ValueType::Array),
575                Some(other.value_type()),
576            ))),
577            None => Err(crate::Deserializer::error(ErrorType::Unexpected(
578                Some(ValueType::Array),
579                None,
580            ))),
581        }
582    }
583
584    fn struct_variant<V>(
585        self,
586        _fields: &'static [&'static str],
587        visitor: V,
588    ) -> Result<V::Value, Error>
589    where
590        V: Visitor<'de>,
591    {
592        match self.value {
593            Some(Value::Object(o)) => visitor.visit_map(ObjectAccess::new(o.into_iter())),
594            Some(other) => Err(crate::Deserializer::error(ErrorType::Unexpected(
595                Some(ValueType::Object),
596                Some(other.value_type()),
597            ))),
598            None => Err(crate::Deserializer::error(ErrorType::Unexpected(
599                Some(ValueType::Object),
600                None,
601            ))),
602        }
603    }
604}
605
606impl<'de> de::Deserializer<'de> for &'de Value<'de> {
607    type Error = Error;
608
609    // Look at the input data to decide what Serde data model type to
610    // deserialize as. Not all data formats are able to support this operation.
611    // Formats that support `deserialize_any` are known as self-describing.
612    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
613    where
614        V: Visitor<'de>,
615    {
616        match self {
617            Value::Static(StaticNode::Null) => visitor.visit_unit(),
618            Value::Static(StaticNode::Bool(b)) => visitor.visit_bool(*b),
619            Value::Static(StaticNode::I64(n)) => visitor.visit_i64(*n),
620            #[cfg(feature = "128bit")]
621            Value::Static(StaticNode::I128(n)) => visitor.visit_i128(*n),
622            Value::Static(StaticNode::U64(n)) => visitor.visit_u64(*n),
623            #[cfg(feature = "128bit")]
624            Value::Static(StaticNode::U128(n)) => visitor.visit_u128(*n),
625            #[allow(clippy::useless_conversion)] // .into() required by ordered-float
626            Value::Static(StaticNode::F64(n)) => visitor.visit_f64((*n).into()),
627            Value::String(s) => visitor.visit_borrowed_str(s),
628            Value::Array(a) => visitor.visit_seq(ArrayRef(a.as_slice().iter())),
629            Value::Object(o) => visitor.visit_map(ObjectRefAccess::new(o.iter())),
630        }
631    }
632
633    #[cfg_attr(not(feature = "no-inline"), inline)]
634    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
635    where
636        V: Visitor<'de>,
637    {
638        if self == &Value::Static(StaticNode::Null) {
639            visitor.visit_unit()
640        } else {
641            visitor.visit_some(self)
642        }
643    }
644    #[cfg_attr(not(feature = "no-inline"), inline)]
645    fn deserialize_newtype_struct<V>(
646        self,
647        _name: &'static str,
648        visitor: V,
649    ) -> Result<V::Value, Error>
650    where
651        V: Visitor<'de>,
652    {
653        visitor.visit_newtype_struct(self)
654    }
655
656    #[cfg_attr(not(feature = "no-inline"), inline)]
657    fn deserialize_struct<V>(
658        self,
659        _name: &'static str,
660        _fields: &'static [&'static str],
661        visitor: V,
662    ) -> Result<V::Value, Error>
663    where
664        V: Visitor<'de>,
665    {
666        match self {
667            // Give the visitor access to each element of the sequence.
668            Value::Array(a) => visitor.visit_seq(ArrayRef(a.as_slice().iter())),
669            Value::Object(o) => visitor.visit_map(ObjectRefAccess::new(o.iter())),
670            other => Err(crate::Deserializer::error(ErrorType::Unexpected(
671                Some(ValueType::Object),
672                Some(other.value_type()),
673            ))),
674        }
675    }
676
677    #[cfg_attr(not(feature = "no-inline"), inline)]
678    fn deserialize_enum<V>(
679        self,
680        _name: &str,
681        _variants: &'static [&'static str],
682        visitor: V,
683    ) -> Result<V::Value, Error>
684    where
685        V: Visitor<'de>,
686    {
687        let (variant, value) = match self {
688            Value::Object(value) => {
689                let mut iter = value.iter();
690                let (variant, value) = match iter.next() {
691                    Some(v) => v,
692                    None => {
693                        return Err(crate::Deserializer::error(ErrorType::Eof));
694                    }
695                };
696                // enums are encoded in json as maps with a single key:value pair
697                if iter.next().is_some() {
698                    return Err(crate::Deserializer::error(ErrorType::TrailingData));
699                }
700                (variant, Some(value))
701            }
702            Value::String(variant) => (variant, None),
703            other => {
704                return Err(crate::Deserializer::error(ErrorType::Unexpected(
705                    Some(ValueType::Object),
706                    Some(other.value_type()),
707                )));
708            }
709        };
710
711        visitor.visit_enum(EnumRefDeserializer { variant, value })
712    }
713
714    forward_to_deserialize_any! {
715        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
716            bytes byte_buf unit unit_struct seq tuple
717            tuple_struct map identifier ignored_any
718    }
719}
720
721struct EnumRefDeserializer<'de> {
722    variant: &'de Cow<'de, str>,
723    value: Option<&'de Value<'de>>,
724}
725
726impl<'de> EnumAccess<'de> for EnumRefDeserializer<'de> {
727    type Error = Error;
728    type Variant = VariantRefDeserializer<'de>;
729
730    #[cfg(feature = "beef")]
731    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
732    where
733        V: DeserializeSeed<'de>,
734    {
735        let variant = self.variant.into_deserializer();
736        let visitor = VariantRefDeserializer { value: self.value };
737        seed.deserialize(variant).map(|v| (v, visitor))
738    }
739    #[cfg(not(feature = "beef"))]
740    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
741    where
742        V: DeserializeSeed<'de>,
743    {
744        let var: &str = self.variant;
745        let variant = var.into_deserializer();
746        let visitor = VariantRefDeserializer { value: self.value };
747        seed.deserialize(variant).map(|v| (v, visitor))
748    }
749}
750struct VariantRefDeserializer<'de> {
751    value: Option<&'de Value<'de>>,
752}
753
754impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> {
755    type Error = Error;
756
757    fn unit_variant(self) -> Result<(), Error> {
758        match self.value {
759            Some(value) => Deserialize::deserialize(value),
760            None => Ok(()),
761        }
762    }
763
764    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
765    where
766        T: DeserializeSeed<'de>,
767    {
768        match self.value {
769            Some(value) => seed.deserialize(value),
770            None => Err(crate::Deserializer::error(ErrorType::Unexpected(
771                Some(ValueType::Object),
772                None,
773            ))),
774        }
775    }
776
777    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
778    where
779        V: Visitor<'de>,
780    {
781        match self.value {
782            Some(Value::Array(v)) => {
783                if v.is_empty() {
784                    visitor.visit_unit()
785                } else {
786                    visitor.visit_seq(ArrayRef(v.as_slice().iter()))
787                }
788            }
789            Some(other) => Err(crate::Deserializer::error(ErrorType::Unexpected(
790                Some(ValueType::Array),
791                Some(other.value_type()),
792            ))),
793            None => Err(crate::Deserializer::error(ErrorType::Unexpected(
794                Some(ValueType::Array),
795                None,
796            ))),
797        }
798    }
799
800    fn struct_variant<V>(
801        self,
802        _fields: &'static [&'static str],
803        visitor: V,
804    ) -> Result<V::Value, Error>
805    where
806        V: Visitor<'de>,
807    {
808        match self.value {
809            Some(Value::Object(o)) => visitor.visit_map(ObjectRefAccess::new(o.iter())),
810            Some(other) => Err(crate::Deserializer::error(ErrorType::Unexpected(
811                Some(ValueType::Object),
812                Some(other.value_type()),
813            ))),
814            None => Err(crate::Deserializer::error(ErrorType::Unexpected(
815                Some(ValueType::Object),
816                None,
817            ))),
818        }
819    }
820}
821
822#[cfg(test)]
823mod test {
824    use serde::Deserialize;
825
826    use crate::{borrowed, json, prelude::*};
827
828    #[test]
829    fn option_field_absent_owned() {
830        #[derive(serde::Deserialize, Debug, PartialEq, Eq)]
831        pub struct Person {
832            pub name: String,
833            pub middle_name: Option<String>,
834            pub friends: Vec<String>,
835        }
836        let mut raw_json = r#"{"name":"bob","friends":[]}"#.to_string();
837        let result: Result<Person, _> =
838            crate::to_borrowed_value(unsafe { raw_json.as_bytes_mut() })
839                .and_then(super::super::from_value);
840        assert_eq!(
841            result,
842            Ok(Person {
843                name: "bob".to_string(),
844                middle_name: None,
845                friends: vec![]
846            })
847        );
848    }
849    #[test]
850    fn option_field_present_owned() {
851        #[derive(serde::Deserialize, Debug, PartialEq, Eq)]
852        pub struct Point {
853            pub x: u64,
854            pub y: u64,
855        }
856        #[derive(serde::Deserialize, Debug, PartialEq, Eq)]
857        pub struct Person {
858            pub name: String,
859            pub middle_name: Option<String>,
860            pub friends: Vec<String>,
861            pub pos: Point,
862        }
863
864        let mut raw_json =
865            r#"{"name":"bob","middle_name": "frank", "friends":[], "pos":[0,1]}"#.to_string();
866        let result: Result<Person, _> =
867            crate::to_borrowed_value(unsafe { raw_json.as_bytes_mut() })
868                .and_then(super::super::from_value);
869        assert_eq!(
870            result,
871            Ok(Person {
872                name: "bob".to_string(),
873                middle_name: Some("frank".to_string()),
874                friends: vec![],
875                pos: Point { x: 0, y: 1 },
876            })
877        );
878    }
879
880    #[test]
881    fn deserialize() {
882        use halfbrown::{hashmap, HashMap};
883        #[derive(serde::Deserialize, Debug, PartialEq, Eq)]
884        #[serde(rename_all = "lowercase")]
885        pub enum Rotate {
886            Left,
887            Right,
888            Up,
889            Down,
890        }
891        #[derive(serde::Deserialize, Debug, PartialEq)]
892        pub struct Point {
893            pub x: i64,
894            pub y: i64,
895            pub z: f64,
896            pub rotate: Rotate,
897        }
898        #[derive(serde::Deserialize, Debug, PartialEq)]
899        pub struct Person {
900            pub name: String,
901            pub middle_name: Option<String>,
902            pub friends: Vec<String>,
903            pub pos: Point,
904            pub age: u64,
905        }
906        #[derive(serde::Deserialize, Debug, PartialEq, Eq)]
907        pub struct TestStruct {
908            pub key: HashMap<String, String>,
909            pub vec: Vec<Vec<Option<u8>>>,
910        }
911
912        let mut raw_json =
913            r#"{"name":"bob","middle_name": "frank", "friends":[], "pos": [-1, 2, -3.25, "up"], "age": 123}"#.to_string();
914        let value =
915            crate::to_borrowed_value(unsafe { raw_json.as_bytes_mut() }).expect("to_owned_value");
916        let result: Person = super::super::from_refvalue(&value).expect("from_refvalue");
917        let expected = Person {
918            name: "bob".to_string(),
919            middle_name: Some("frank".to_string()),
920            friends: Vec::new(),
921            pos: Point {
922                x: -1,
923                y: 2,
924                z: -3.25_f64,
925                rotate: Rotate::Up,
926            },
927            age: 123,
928        };
929        assert_eq!(result, expected);
930
931        let mut raw_json = r#"{"key":{"subkey": "value"}, "vec":[[null], [1]]}"#.to_string();
932        let value =
933            crate::to_borrowed_value(unsafe { raw_json.as_bytes_mut() }).expect("to_owned_value");
934        let result: TestStruct = super::super::from_refvalue(&value).expect("from_refvalue");
935        let expected = TestStruct {
936            key: hashmap!("subkey".to_string() => "value".to_string()),
937            vec: vec![vec![None], vec![Some(1)]],
938        };
939        assert_eq!(result, expected);
940    }
941
942    #[cfg(feature = "128bit")]
943    #[test]
944    fn deserialize_128bit() {
945        let value = i64::MIN as i128 - 1;
946        let int128 = crate::BorrowedValue::Static(crate::StaticNode::I128(value));
947        let res: i128 = super::super::from_refvalue(&int128).expect("from_refvalue");
948        assert_eq!(value, res);
949
950        let value = u64::MAX as u128;
951        let int128 = crate::BorrowedValue::Static(crate::StaticNode::U128(value));
952        let res: u128 = super::super::from_refvalue(&int128).expect("from_refvalue");
953        assert_eq!(value, res);
954    }
955
956    #[test]
957    fn variant() {
958        struct NameAndConfig<'v> {
959            name: String,
960            config: Option<borrowed::Value<'v>>,
961        }
962        impl<'v> serde::Deserialize<'v> for NameAndConfig<'v> {
963            fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
964            where
965                D: serde::Deserializer<'v>,
966            {
967                #[derive(Deserialize)]
968                // This is ugly but it's needed for `serde::Deserialize` to not explode on lifetimes
969                // An error like this is otherwise produced:
970                //     error: lifetime may not live long enough
971                //     --> src/serde/value/borrowed/de.rs:960:25
972                //      |
973                //  953 |                 #[derive(Deserialize)]
974                //      |                          ----------- lifetime `'de` defined here
975                //  ...
976                //  956 |                 enum Variants<'v> {
977                //      |                               -- lifetime `'v` defined here
978                //  ...
979                //  960 |                         config: Option<borrowed::Value<'v>>,
980                //      |                         ^^^^^^ requires that `'de` must outlive `'v`
981                //      |
982                //      = help: consider adding the following bound: `'de: 'v`
983
984                //  error: lifetime may not live long enough
985                //     --> src/serde/value/borrowed/de.rs:960:25
986                //      |
987                //  953 |                 #[derive(Deserialize)]
988                //      |                          ----------- lifetime `'de` defined here
989                //  ...
990                //  956 |                 enum Variants<'v> {
991                //      |                               -- lifetime `'v` defined here
992                //  ...
993                //  960 |                         config: Option<borrowed::Value<'v>>,
994                //      |                         ^^^^^^ requires that `'v` must outlive `'de`
995                //      |
996                //      = help: consider adding the following bound: `'v: 'de`
997                #[serde(bound(deserialize = "'de: 'v, 'v: 'de"), untagged)]
998                enum Variants<'v> {
999                    Name(String),
1000                    NameAndConfig {
1001                        name: String,
1002                        config: Option<borrowed::Value<'v>>,
1003                    },
1004                }
1005
1006                let var = Variants::deserialize(deserializer)?;
1007
1008                match var {
1009                    Variants::Name(name) => Ok(NameAndConfig { name, config: None }),
1010                    Variants::NameAndConfig { name, config } => Ok(NameAndConfig { name, config }),
1011                }
1012            }
1013        }
1014
1015        let v = json!({"name": "name", "config": 42});
1016        let nac = NameAndConfig::deserialize(v).expect("could structurize two element struct");
1017        assert_eq!(nac.name, "name");
1018        assert_eq!(nac.config.as_u8(), Some(42));
1019        let v = json!({"name": "name"});
1020        let nac = NameAndConfig::deserialize(v).expect("could structurize one element struct");
1021        assert_eq!(nac.name, "name");
1022        assert_eq!(nac.config, None);
1023        let v = json!("name");
1024        let nac = NameAndConfig::deserialize(v).expect("could structurize string");
1025        assert_eq!(nac.name, "name");
1026        assert_eq!(nac.config, None);
1027    }
1028}