1use crate::any::Any;
2use crate::encoding::read::Error;
3use serde::de::value::{MapAccessDeserializer, MapDeserializer, SeqDeserializer};
4use serde::de::{IntoDeserializer, MapAccess, SeqAccess, Visitor};
5use serde::{Deserialize, Deserializer};
6use std::any::type_name;
7use std::collections::HashMap;
8use std::convert::{TryFrom, TryInto};
9use std::fmt::{Display, Formatter};
10use std::sync::Arc;
11
12pub fn from_any<'de, T: Deserialize<'de>>(any: &'de Any) -> Result<T, Error> {
13 let deserializer = AnyDeserializer { value: any };
14 T::deserialize(deserializer)
15}
16
17impl<'de> Deserialize<'de> for Any {
18 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
19 where
20 D: Deserializer<'de>,
21 {
22 struct AnyVisitor;
23 impl<'de> Visitor<'de> for AnyVisitor {
24 type Value = Any;
25
26 fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
27 formatter.write_str("enum Any")
28 }
29
30 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
31 where
32 E: serde::de::Error,
33 {
34 Ok(Any::from(v))
35 }
36
37 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
38 where
39 E: serde::de::Error,
40 {
41 Ok(Any::Number(v as f64))
42 }
43
44 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
45 where
46 E: serde::de::Error,
47 {
48 Ok(Any::from(v))
49 }
50
51 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
52 where
53 E: serde::de::Error,
54 {
55 Ok(Any::from(v))
56 }
57
58 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
59 where
60 E: serde::de::Error,
61 {
62 Ok(Any::from(v))
63 }
64
65 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
66 where
67 E: serde::de::Error,
68 {
69 Ok(Any::Number(v as f64))
70 }
71
72 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
73 where
74 E: serde::de::Error,
75 {
76 Ok(Any::from(v))
77 }
78
79 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
80 where
81 E: serde::de::Error,
82 {
83 Ok(Any::from(v))
84 }
85
86 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
87 where
88 E: serde::de::Error,
89 {
90 match Any::try_from(v) {
91 Ok(any) => Ok(any),
92 Err(v) => Err(serde::de::Error::custom(format!(
93 "Value {} out of range for i64",
94 v
95 ))),
96 }
97 }
98
99 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
100 where
101 E: serde::de::Error,
102 {
103 Ok(Any::from(v))
104 }
105
106 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
107 where
108 E: serde::de::Error,
109 {
110 Ok(Any::from(v))
111 }
112
113 fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
114 where
115 E: serde::de::Error,
116 {
117 Ok(Any::from(v.to_string()))
118 }
119
120 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
121 where
122 E: serde::de::Error,
123 {
124 Ok(Any::from(v))
125 }
126
127 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
128 where
129 E: serde::de::Error,
130 {
131 Ok(Any::from(v))
132 }
133
134 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
135 where
136 E: serde::de::Error,
137 {
138 Ok(Any::from(v))
139 }
140
141 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
142 where
143 E: serde::de::Error,
144 {
145 Ok(Any::from(v))
146 }
147
148 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
149 where
150 E: serde::de::Error,
151 {
152 Ok(Any::from(v))
153 }
154
155 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
156 where
157 E: serde::de::Error,
158 {
159 Ok(Any::from(v))
160 }
161
162 fn visit_none<E>(self) -> Result<Self::Value, E>
163 where
164 E: serde::de::Error,
165 {
166 Ok(Any::Null)
167 }
168
169 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
170 where
171 D: Deserializer<'de>,
172 {
173 Any::deserialize(deserializer)
174 }
175
176 fn visit_unit<E>(self) -> Result<Self::Value, E>
177 where
178 E: serde::de::Error,
179 {
180 Ok(Any::Null)
181 }
182
183 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
184 where
185 A: SeqAccess<'de>,
186 {
187 let mut vec = Vec::new();
188
189 while let Some(value) = seq.next_element()? {
190 vec.push(value);
191 }
192
193 Ok(Any::Array(vec.into()))
194 }
195
196 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
197 where
198 A: MapAccess<'de>,
199 {
200 let mut any_map = HashMap::new();
201 while let Some((key, value)) = map.next_entry()? {
202 any_map.insert(key, value);
203 }
204
205 Ok(Any::Map(Arc::new(any_map)))
206 }
207 }
208
209 deserializer.deserialize_any(AnyVisitor)
210 }
211}
212
213pub struct AnyDeserializer<'a> {
214 value: &'a Any,
215}
216
217impl<'de, 'a: 'de> IntoDeserializer<'de, Error> for &'a Any {
218 type Deserializer = AnyDeserializer<'de>;
219
220 fn into_deserializer(self) -> Self::Deserializer {
221 AnyDeserializer { value: self }
222 }
223}
224
225impl serde::de::Error for Error {
226 fn custom<T>(msg: T) -> Self
227 where
228 T: Display,
229 {
230 Error::Custom(msg.to_string())
231 }
232}
233
234impl<'de> Deserializer<'de> for AnyDeserializer<'de> {
235 type Error = Error;
236
237 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
238 where
239 V: Visitor<'de>,
240 {
241 match self.value {
242 Any::Null => self.deserialize_unit(visitor),
243 Any::Undefined => self.deserialize_unit(visitor),
244 Any::Bool(_) => self.deserialize_bool(visitor),
245 Any::Number(_) => self.deserialize_f64(visitor),
246 Any::BigInt(_) => self.deserialize_i64(visitor),
247 Any::String(_) => self.deserialize_string(visitor),
248 Any::Buffer(_) => self.deserialize_byte_buf(visitor),
249 Any::Array(_) => self.deserialize_seq(visitor),
250 Any::Map(_) => self.deserialize_map(visitor),
251 }
252 }
253
254 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
255 where
256 V: Visitor<'de>,
257 {
258 match self.value {
259 Any::Bool(b) => visitor.visit_bool(*b),
260 _ => Err(Error::TypeMismatch(type_name::<bool>())),
261 }
262 }
263
264 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
265 where
266 V: Visitor<'de>,
267 {
268 let value = match self.value {
269 Any::Number(i) => {
270 if i.fract() == 0.0 {
271 *i as i64
272 } else {
273 return Err(Error::type_mismatch::<i8>());
274 }
275 }
276 Any::BigInt(i) => *i,
277 _ => return Err(Error::type_mismatch::<i8>()),
278 }
279 .try_into()
280 .map_err(|_| Error::UnexpectedValue)?;
281 visitor.visit_i8(value)
282 }
283
284 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
285 where
286 V: Visitor<'de>,
287 {
288 let value = match self.value {
289 Any::Number(i) => {
290 if i.fract() == 0.0 {
291 *i as i64
292 } else {
293 return Err(Error::type_mismatch::<i16>());
294 }
295 }
296 Any::BigInt(i) => *i,
297 _ => return Err(Error::type_mismatch::<i16>()),
298 }
299 .try_into()
300 .map_err(|_| Error::UnexpectedValue)?;
301 visitor.visit_i16(value)
302 }
303
304 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
305 where
306 V: Visitor<'de>,
307 {
308 let value = match self.value {
309 Any::Number(i) => {
310 if i.fract() == 0.0 {
311 *i as i64
312 } else {
313 return Err(Error::type_mismatch::<i32>());
314 }
315 }
316 Any::BigInt(i) => *i,
317 _ => return Err(Error::type_mismatch::<i32>()),
318 }
319 .try_into()
320 .map_err(|_| Error::UnexpectedValue)?;
321 visitor.visit_i32(value)
322 }
323
324 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
325 where
326 V: Visitor<'de>,
327 {
328 let value = match self.value {
329 Any::Number(i) => {
330 if i.fract() == 0.0 {
331 *i as i64
332 } else {
333 return Err(Error::type_mismatch::<i64>());
334 }
335 }
336 Any::BigInt(i) => *i,
337 _ => return Err(Error::type_mismatch::<i64>()),
338 };
339 visitor.visit_i64(value)
340 }
341
342 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
343 where
344 V: Visitor<'de>,
345 {
346 let value = match self.value {
347 Any::Number(i) => {
348 if i.fract() == 0.0 {
349 *i as i64
350 } else {
351 return Err(Error::type_mismatch::<u8>());
352 }
353 }
354 Any::BigInt(i) => *i,
355 _ => return Err(Error::type_mismatch::<u8>()),
356 }
357 .try_into()
358 .map_err(|_| Error::UnexpectedValue)?;
359 visitor.visit_u8(value)
360 }
361
362 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
363 where
364 V: Visitor<'de>,
365 {
366 let value = match self.value {
367 Any::Number(i) => {
368 if i.fract() == 0.0 {
369 *i as i64
370 } else {
371 return Err(Error::type_mismatch::<u16>());
372 }
373 }
374 Any::BigInt(i) => *i,
375 _ => return Err(Error::type_mismatch::<u16>()),
376 }
377 .try_into()
378 .map_err(|_| Error::UnexpectedValue)?;
379 visitor.visit_u16(value)
380 }
381
382 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
383 where
384 V: Visitor<'de>,
385 {
386 let value = match self.value {
387 Any::Number(i) => {
388 if i.fract() == 0.0 {
389 *i as i64
390 } else {
391 return Err(Error::type_mismatch::<u32>());
392 }
393 }
394 Any::BigInt(i) => *i,
395 _ => return Err(Error::type_mismatch::<u32>()),
396 }
397 .try_into()
398 .map_err(|_| Error::UnexpectedValue)?;
399 visitor.visit_u32(value)
400 }
401
402 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
403 where
404 V: Visitor<'de>,
405 {
406 let value = match self.value {
407 Any::Number(i) => {
408 if i.fract() == 0.0 {
409 *i as i64
410 } else {
411 return Err(Error::type_mismatch::<u64>());
412 }
413 }
414 Any::BigInt(i) => *i,
415 _ => return Err(Error::type_mismatch::<u64>()),
416 }
417 .try_into()
418 .map_err(|_| Error::UnexpectedValue)?;
419 visitor.visit_u64(value)
420 }
421
422 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
423 where
424 V: Visitor<'de>,
425 {
426 match self.value {
427 Any::Number(f) => visitor.visit_f32(*f as f32),
428 Any::BigInt(f) => visitor.visit_f32(*f as f32),
429 _ => Err(Error::type_mismatch::<f32>()),
430 }
431 }
432
433 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
434 where
435 V: Visitor<'de>,
436 {
437 match self.value {
438 Any::Number(f) => visitor.visit_f64(*f),
439 Any::BigInt(f) => visitor.visit_f64(*f as f64),
440 _ => Err(Error::type_mismatch::<f64>()),
441 }
442 }
443
444 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
445 where
446 V: Visitor<'de>,
447 {
448 match self.value {
449 Any::String(s) => {
450 let mut chars = s.chars();
451 match (chars.next(), chars.next()) {
453 (Some(c), None) => visitor.visit_char(c),
454 _ => Err(Error::type_mismatch::<char>()),
455 }
456 }
457 _ => Err(Error::type_mismatch::<char>()),
458 }
459 }
460
461 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
462 where
463 V: Visitor<'de>,
464 {
465 match self.value {
466 Any::String(s) => visitor.visit_borrowed_str(s),
467 _ => Err(Error::type_mismatch::<&str>()),
468 }
469 }
470
471 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
472 where
473 V: Visitor<'de>,
474 {
475 match self.value {
476 Any::String(s) => visitor.visit_string(s.to_string()),
477 _ => Err(Error::type_mismatch::<String>()),
478 }
479 }
480
481 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
482 where
483 V: Visitor<'de>,
484 {
485 match self.value {
486 Any::Buffer(b) => visitor.visit_borrowed_bytes(b),
487 _ => Err(Error::type_mismatch::<&[u8]>()),
488 }
489 }
490
491 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
492 where
493 V: Visitor<'de>,
494 {
495 match self.value {
496 Any::Buffer(b) => visitor.visit_bytes(b),
497 _ => Err(Error::type_mismatch::<Vec<u8>>()),
498 }
499 }
500
501 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
502 where
503 V: Visitor<'de>,
504 {
505 match self.value {
506 Any::Null | Any::Undefined => visitor.visit_none(),
507 _ => visitor.visit_some(self),
508 }
509 }
510
511 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
512 where
513 V: Visitor<'de>,
514 {
515 match self.value {
516 Any::Null | Any::Undefined => visitor.visit_unit(),
517 _ => Err(Error::type_mismatch::<()>()),
518 }
519 }
520
521 fn deserialize_unit_struct<V>(
522 self,
523 _name: &'static str,
524 visitor: V,
525 ) -> Result<V::Value, Self::Error>
526 where
527 V: Visitor<'de>,
528 {
529 self.deserialize_unit(visitor)
530 }
531
532 fn deserialize_newtype_struct<V>(
533 self,
534 _name: &'static str,
535 visitor: V,
536 ) -> Result<V::Value, Self::Error>
537 where
538 V: Visitor<'de>,
539 {
540 visitor.visit_newtype_struct(self)
541 }
542
543 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
544 where
545 V: Visitor<'de>,
546 {
547 match self.value {
548 Any::Array(a) => visitor.visit_seq(SeqDeserializer::new(a.iter())),
549 _ => visitor.visit_some(self),
550 }
551 }
552
553 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
554 where
555 V: Visitor<'de>,
556 {
557 self.deserialize_seq(visitor)
558 }
559
560 fn deserialize_tuple_struct<V>(
561 self,
562 _name: &'static str,
563 _len: usize,
564 visitor: V,
565 ) -> Result<V::Value, Self::Error>
566 where
567 V: Visitor<'de>,
568 {
569 self.deserialize_seq(visitor)
570 }
571
572 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
573 where
574 V: Visitor<'de>,
575 {
576 match self.value {
577 Any::Map(m) => visitor.visit_map(MapDeserializer::new(
578 m.iter().map(|(key, value)| (key.as_str(), value)),
579 )),
580 _ => Err(Error::type_mismatch::<V::Value>()),
581 }
582 }
583
584 fn deserialize_struct<V>(
585 self,
586 _name: &'static str,
587 _fields: &'static [&'static str],
588 visitor: V,
589 ) -> Result<V::Value, Self::Error>
590 where
591 V: Visitor<'de>,
592 {
593 self.deserialize_map(visitor)
594 }
595
596 fn deserialize_enum<V>(
597 self,
598 _name: &'static str,
599 _variants: &'static [&'static str],
600 visitor: V,
601 ) -> Result<V::Value, Self::Error>
602 where
603 V: Visitor<'de>,
604 {
605 match self.value {
606 Any::String(s) => visitor.visit_enum(s.into_deserializer()),
607 Any::Map(m) => visitor.visit_enum(MapAccessDeserializer::new(MapDeserializer::new(
608 m.iter().map(|(key, value)| (key.as_str(), value)),
609 ))),
610 _ => Err(Error::type_mismatch::<V::Value>()),
611 }
612 }
613
614 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
615 where
616 V: Visitor<'de>,
617 {
618 self.deserialize_str(visitor)
619 }
620
621 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
622 where
623 V: Visitor<'de>,
624 {
625 self.deserialize_any(visitor)
626 }
627}
628
629#[cfg(test)]
630mod test {
631 use super::*;
632 use crate::any::Any;
633 use serde::Deserialize;
634 use std::collections::HashMap;
635
636 #[test]
637 fn test_deserialize_any_from_bool() {
638 assert_eq!(
639 serde_json::from_str::<Any>("true").unwrap(),
640 Any::from(true)
641 );
642 }
643
644 #[test]
645 fn test_deserialize_any_from_float() {
646 assert_eq!(
647 serde_json::from_str::<Any>("18.812036").unwrap(),
648 Any::from(18.812036f64)
649 );
650 }
651
652 #[test]
653 fn test_deserialize_any_from_int() {
654 assert_eq!(serde_json::from_str::<Any>("18").unwrap(), Any::from(18));
655 }
656
657 #[test]
658 fn test_deserialize_any_from_int_unrepresentable() {
659 assert!(serde_json::from_str::<Any>(&u64::MAX.to_string()).is_err());
660 }
661
662 #[test]
663 fn test_deserialize_any_from_string() {
664 assert_eq!(
665 serde_json::from_str::<Any>("\"string\"").unwrap(),
666 Any::from("string")
667 );
668 }
669
670 #[test]
671 fn test_deserialize_any_from_null() {
672 assert_eq!(serde_json::from_str::<Any>("null").unwrap(), Any::Null);
673 }
674
675 #[test]
676 fn test_deserialize_any_from_array() {
677 assert_eq!(
678 serde_json::from_str::<Any>("[true, -101]").unwrap(),
679 Any::from(vec![Any::from(true), Any::from(-101)])
680 );
681 }
682
683 #[test]
684 fn test_deserialize_any_from_map() {
685 assert_eq!(
686 serde_json::from_str::<Any>("{\"key1\":true,\"key2\":-12307.2138}").unwrap(),
687 Any::from(HashMap::from([
688 ("key1".into(), Any::from(true)),
689 ("key2".into(), Any::from(-12307.2138f64))
690 ]))
691 );
692 }
693
694 #[test]
695 fn test_deserialize_any_from_nested_map() {
696 assert_eq!(
697 serde_json::from_str::<Any>("{\"key1\":true,\"key2\":1.1,\"key3\":{\"key4\":true,\"key5\":1},\"key6\":[true,1,null]}").unwrap(),
698 Any::from(HashMap::from([
699 ("key1".into(), Any::from(true)),
700 ("key2".into(), Any::from(1.1f64)),
701 ("key3".into(), Any::from(
702 HashMap::from([
703 ("key4".into(), Any::from(true)),
704 ("key5".into(), Any::from(1))
705 ])
706 )),
707 ("key6".into(), Any::from(vec![Any::from(true), Any::from(1), Any::Null]))
708 ])
709 )
710 );
711 }
712
713 #[test]
714 fn test_any_deserializer_many_fields() {
715 #[derive(Debug, Deserialize, PartialEq)]
716 struct Test {
717 bool: bool,
718 int: i64,
719 negative_int: i64,
720 max_int: i64,
721 min_int: i64,
722 real_number: f64,
723 max_number: f64,
724 min_number: f64,
725 null: Option<bool>,
726 some: Option<bool>,
727 undefined: Option<bool>,
728 nested: Nested,
729 enum_a: StringEnum,
730 enum_b: StringEnum,
731 }
732
733 #[derive(Debug, Deserialize, PartialEq)]
734 struct Nested {
735 int: i16,
736 other: f32,
737 }
738
739 #[derive(Debug, Deserialize, PartialEq)]
740 enum StringEnum {
741 VariantA,
742 VariantB,
743 }
744
745 let any = Any::from(HashMap::from([
746 ("bool".to_string(), Any::from(true)),
747 ("int".to_string(), Any::from(1)),
748 ("negative_int".to_string(), Any::from(-1)),
749 ("max_int".to_string(), Any::from(i64::MAX)),
750 ("min_int".to_string(), Any::from(i64::MIN)),
751 ("real_number".to_string(), Any::from(-123.2387f64)),
752 ("max_number".to_string(), Any::from(f64::MIN)),
753 ("min_number".to_string(), Any::from(f64::MAX)),
754 ("null".to_string(), Any::Null),
755 ("some".to_string(), Any::from(false)),
756 ("undefined".to_string(), Any::Undefined),
757 (
758 "nested".to_string(),
759 Any::from(HashMap::from([
760 ("int".to_string(), Any::from(100)),
761 ("other".to_string(), Any::from(100.0)),
762 ])),
763 ),
764 ("enum_a".to_string(), "VariantA".into()),
765 ("enum_b".to_string(), "VariantB".into()),
766 ]));
767
768 assert_eq!(
769 Test {
770 bool: true,
771 int: 1,
772 negative_int: -1,
773 max_int: i64::MAX,
774 min_int: i64::MIN,
775 real_number: -123.2387f64,
776 max_number: f64::MIN,
777 min_number: f64::MAX,
778 null: None,
779 some: Some(false),
780 undefined: None,
781 nested: Nested {
782 int: 100,
783 other: 100.0
784 },
785 enum_a: StringEnum::VariantA,
786 enum_b: StringEnum::VariantB
787 },
788 from_any(&any).unwrap()
789 )
790 }
791
792 #[test]
793 fn test_deserialize_any_to_any() {
794 let any = Any::from(HashMap::from([
795 ("bool".to_string(), Any::from(true)),
796 ("int".to_string(), Any::from(1)),
797 ("negative_int".to_string(), Any::from(-1)),
798 ("max_int".to_string(), Any::from(i64::MAX)),
799 ("min_int".to_string(), Any::from(i64::MIN)),
800 ("real_number".to_string(), Any::from(-123.2387f64)),
801 ("max_number".to_string(), Any::from(f64::MIN)),
802 ("min_number".to_string(), Any::from(f64::MAX)),
803 ("null".to_string(), Any::Null),
804 ("some".to_string(), Any::from(false)),
805 (
806 "nested".to_string(),
807 Any::from(HashMap::from([
808 ("int".to_string(), Any::from(1i64 << 54)),
809 ("other".to_string(), Any::from(100.0)),
810 ])),
811 ),
812 ("enum_a".to_string(), "VariantA".into()),
813 ("enum_b".to_string(), "VariantB".into()),
814 ]));
815
816 assert_eq!(any, from_any(&any.clone()).unwrap())
817 }
818
819 #[test]
820 fn test_any_deserializer_multiple_borrows() {
821 #[derive(Debug, Deserialize, PartialEq)]
822 struct Test<'a> {
823 str: &'a str,
824 bytes: &'a [u8],
825 }
826
827 let any = Any::from(HashMap::from([
828 ("str".to_string(), Any::from("String")),
829 ("bytes".to_string(), b"Bytes".to_vec().into()),
830 ]));
831
832 assert_eq!(
833 Test {
834 str: "String",
835 bytes: b"Bytes"
836 },
837 from_any(&any).unwrap()
838 )
839 }
840
841 #[test]
842 fn test_any_deserializer_nested_array() {
843 #[derive(Debug, Deserialize, PartialEq)]
844 struct Test {
845 array: Vec<Vec<bool>>,
846 }
847
848 let any: Any = HashMap::from([(
849 "array".to_string(),
850 Any::from(vec![
851 Any::from(vec![Any::Bool(true), Any::Bool(false)]),
852 Any::from(vec![Any::Bool(true)]),
853 ]),
854 )])
855 .into();
856
857 assert_eq!(
858 Test {
859 array: vec![vec![true, false], vec![true]]
860 },
861 from_any(&any).unwrap()
862 )
863 }
864
865 #[test]
866 fn test_any_deserializer_undefined() {
867 #[derive(Debug, Deserialize, PartialEq)]
868 struct Test {
869 undefined: Option<bool>,
870 }
871
872 let any: Any = HashMap::from([("undefined".to_string(), Any::Undefined)]).into();
873
874 assert_eq!(Test { undefined: None }, from_any(&any).unwrap())
875 }
876
877 #[test]
878 fn test_any_deserializer_int_does_not_fit_error() {
879 #[derive(Debug, Deserialize, PartialEq)]
880 struct Test {
881 test: i8,
882 }
883
884 let any: Any = HashMap::from([("test".to_string(), Any::BigInt(1000))]).into();
885
886 assert!(matches!(
887 from_any::<Test>(&any).unwrap_err(),
888 Error::UnexpectedValue,
889 ))
890 }
891
892 #[test]
893 fn test_any_deserializer_type_mismatch_error() {
894 #[derive(Debug, Deserialize, PartialEq)]
895 struct Test {
896 test: i8,
897 }
898
899 let any: Any = HashMap::from([("test".to_string(), Any::Number(1000.1f64))]).into();
900
901 let error = from_any::<Test>(&any).unwrap_err();
902 match error {
903 Error::TypeMismatch("i8") => { }
904 other => panic!("unexpected error {}", other),
905 }
906 }
907}