1use 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 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)] 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 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 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
150impl<'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
167impl<'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
193impl<'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
231impl<'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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 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)] 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 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 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 #[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}