1use crate::error::{Error, Result};
10use crate::header::{ElementType, Header};
11use serde::de::{self, Deserialize, IntoDeserializer, SeqAccess, Visitor};
12use std::convert::Infallible;
13use std::io::Read;
14
15pub struct Deserializer<R: Read> {
17 reader: R,
19}
20
21impl<'a> Deserializer<&'a [u8]> {
22 #[allow(clippy::should_implement_trait)]
24 pub fn from_bytes(input: &'a [u8]) -> Self {
25 Deserializer { reader: input }
26 }
27}
28
29pub fn from_slice<'a, T>(s: &'a [u8]) -> Result<T>
31where
32 T: Deserialize<'a>,
33{
34 let mut deserializer = Deserializer::from_bytes(s);
35 let t = T::deserialize(&mut deserializer)?;
36 if deserializer.reader.is_empty() {
37 Ok(t)
38 } else {
39 Err(Error::TrailingCharacters)
40 }
41}
42
43pub fn from_reader<'a, R: Read, T>(reader: R) -> Result<T>
45where
46 T: Deserialize<'a>,
47{
48 let mut deserializer = Deserializer { reader };
49 let t = T::deserialize(&mut deserializer)?;
50 let Deserializer { mut reader } = deserializer;
51 if reader.read(&mut [0])? == 0 {
52 Ok(t)
53 } else {
54 Err(Error::TrailingCharacters)
55 }
56}
57
58impl<R: Read> Deserializer<R> {
59 fn with_header(&mut self, header: Header) -> Deserializer<impl Read + '_> {
60 let header_bytes = std::io::Cursor::new(header.serialize());
62 let reader = header_bytes.chain(&mut self.reader);
63 Deserializer { reader }
64 }
65
66 fn read_header(&mut self) -> Result<Header> {
67 let mut header_0 = [0u8; 1];
72 if self.reader.read(&mut header_0)? == 0 {
73 return Err(Error::Empty);
74 }
75 let first_byte = header_0[0];
76 let upper_four_bits = first_byte >> 4;
77 let bytes_to_read = match upper_four_bits {
91 0..=11 => 0,
92 12 => 1,
93 13 => 2,
94 14 => 4,
95 15 => 8,
96 n => unreachable!("{n} does not fit in four bits"),
97 };
98 let payload_size: u64 = if bytes_to_read == 0 {
99 u64::from(upper_four_bits)
100 } else {
101 let mut buf = [0u8; 8];
102 let start = 8 - bytes_to_read;
103 self.reader.read_exact(&mut buf[start..8])?;
104 u64::from_be_bytes(buf)
105 };
106 Ok(Header {
107 element_type: ElementType::from(first_byte),
108 payload_size,
109 })
110 }
111
112 fn read_payload_string(&mut self, header: Header) -> Result<String> {
113 let mut str = String::with_capacity(header.payload_size as usize);
114 let read = self.reader_with_limit(header)?.read_to_string(&mut str)?;
115 assert_eq!(read, header.payload_size as usize);
116 Ok(str)
117 }
118
119 fn drop_payload(&mut self, header: Header) -> Result<ElementType> {
120 let mut remaining = header.payload_size;
121 while remaining > 0 {
122 let mut buf = [0u8; 256];
123 let len = buf.len().min(remaining as usize);
124 self.reader.read_exact(&mut buf[..len])?;
125 remaining -= len as u64;
126 }
127 Ok(header.element_type)
128 }
129
130 fn read_bool(&mut self, header: Header) -> Result<bool> {
131 self.drop_payload(header)?;
132 match header.element_type {
133 ElementType::True => Ok(true),
134 ElementType::False => Ok(false),
135 t => Err(Error::UnexpectedType(t)),
136 }
137 }
138
139 fn read_null(&mut self, header: Header) -> Result<()> {
140 self.drop_payload(header)?;
141 match header.element_type {
142 ElementType::Null => Ok(()),
143 t => Err(Error::UnexpectedType(t)),
144 }
145 }
146
147 fn reader_with_limit(&mut self, header: Header) -> Result<impl Read + '_> {
148 let limit =
149 u64::try_from(header.payload_size).map_err(u64_conversion)?;
150 Ok((&mut self.reader).take(limit))
151 }
152
153 fn read_json_compatible<T>(&mut self, header: Header) -> Result<T>
154 where
155 for<'a> T: Deserialize<'a>,
156 {
157 if header.payload_size <= 8 {
158 let mut buf = [0u8; 8];
160 let smallbuf = &mut buf[..header.payload_size as usize];
161 self.reader.read_exact(smallbuf)?;
162 Ok(crate::json::parse_json_slice(smallbuf)?)
163 } else {
164 let mut reader = self.reader_with_limit(header)?;
165 Ok(crate::json::parse_json(&mut reader)?)
166 }
167 }
168
169 fn read_json5_compatible<T>(&mut self, header: Header) -> Result<T>
170 where
171 for<'a> T: Deserialize<'a>,
172 {
173 let mut reader = self.reader_with_limit(header)?;
174 Ok(crate::json::parse_json5(&mut reader)?)
175 }
176
177 fn read_json_compatible_string(
178 &mut self,
179 header: Header,
180 ) -> Result<String> {
181 let mut reader = read_with_quotes(self.reader_with_limit(header)?);
182 Ok(crate::json::parse_json(&mut reader)?)
183 }
184
185 fn read_json5_compatible_string(
186 &mut self,
187 header: Header,
188 ) -> Result<String> {
189 let mut reader = read_with_quotes(self.reader_with_limit(header)?);
190 Ok(crate::json::parse_json5(&mut reader)?)
191 }
192
193 fn read_integer<T>(&mut self, header: Header) -> Result<T>
194 where
195 for<'a> T: Deserialize<'a>,
196 {
197 match header.element_type {
198 ElementType::Int => self.read_json_compatible(header),
199 ElementType::Int5 => self.read_json5_compatible(header),
200 t => Err(Error::UnexpectedType(t)),
201 }
202 }
203
204 fn read_string(&mut self, header: Header) -> Result<String> {
205 match header.element_type {
206 ElementType::Text | ElementType::TextRaw => {
207 self.read_payload_string(header)
208 }
209 ElementType::TextJ => self.read_json_compatible_string(header),
210 ElementType::Text5 => self.read_json5_compatible_string(header),
211 t => Err(Error::UnexpectedType(t)),
212 }
213 }
214
215 fn read_float<T>(&mut self, header: Header) -> Result<T>
216 where
217 for<'a> T: Deserialize<'a>,
218 {
219 match header.element_type {
220 ElementType::Int => self.read_json_compatible(header),
221 ElementType::Int5 => self.read_json5_compatible(header),
222 ElementType::Float => self.read_json_compatible(header),
223 ElementType::Float5 => self.read_json5_compatible(header),
224 t => Err(Error::UnexpectedType(t)),
225 }
226 }
227
228 fn deserialize_any_with_header<'de, V>(
229 &mut self,
230 header: Header,
231 visitor: V,
232 ) -> Result<V::Value>
233 where
234 V: Visitor<'de>,
235 {
236 match header.element_type {
237 ElementType::Null => {
238 self.read_null(header)?;
239 visitor.visit_unit()
240 }
241 ElementType::True | ElementType::False => {
242 visitor.visit_bool(self.read_bool(header)?)
243 }
244 ElementType::Float | ElementType::Float5 => {
245 visitor.visit_f64(self.read_float(header)?)
246 }
247 ElementType::Int | ElementType::Int5 => {
248 let i: i64 = self.read_integer(header)?;
249 if let Ok(x) = u8::try_from(i) {
250 visitor.visit_u8(x)
251 } else if let Ok(x) = i8::try_from(i) {
252 visitor.visit_i8(x)
253 } else if let Ok(x) = u16::try_from(i) {
254 visitor.visit_u16(x)
255 } else if let Ok(x) = i16::try_from(i) {
256 visitor.visit_i16(x)
257 } else if let Ok(x) = u32::try_from(i) {
258 visitor.visit_u32(x)
259 } else if let Ok(x) = i32::try_from(i) {
260 visitor.visit_i32(x)
261 } else if let Ok(x) = u64::try_from(i) {
262 visitor.visit_u64(x)
263 } else {
264 visitor.visit_i64(i)
265 }
266 }
267 ElementType::Array => visitor.visit_seq(self),
268 ElementType::Object => visitor.visit_map(self),
269 ElementType::Text
270 | ElementType::TextJ
271 | ElementType::Text5
272 | ElementType::TextRaw => {
273 visitor.visit_string(self.read_string(header)?)
274 }
275 ElementType::Reserved13
276 | ElementType::Reserved14
277 | ElementType::Reserved15 => {
278 Err(Error::UnexpectedType(header.element_type))
279 }
280 }
281 }
282}
283
284fn read_with_quotes(r: impl Read) -> impl Read {
285 b"\"".chain(r).chain(&b"\""[..])
286}
287
288fn u64_conversion(e: Infallible) -> Error {
289 Error::Io(std::io::Error::new(std::io::ErrorKind::InvalidData, e))
290}
291
292impl<'de, 'a, R: Read> de::Deserializer<'de> for &'a mut Deserializer<R> {
293 type Error = Error;
294
295 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
296 where
297 V: Visitor<'de>,
298 {
299 let header = self.read_header()?;
300 self.deserialize_any_with_header(header, visitor)
301 }
302
303 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
304 where
305 V: Visitor<'de>,
306 {
307 let header = self.read_header()?;
308 visitor.visit_bool(self.read_bool(header)?)
309 }
310
311 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
312 where
313 V: Visitor<'de>,
314 {
315 let header = self.read_header()?;
316 visitor.visit_i8(self.read_integer(header)?)
317 }
318
319 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
320 where
321 V: Visitor<'de>,
322 {
323 let header = self.read_header()?;
324 visitor.visit_i16(self.read_integer(header)?)
325 }
326
327 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
328 where
329 V: Visitor<'de>,
330 {
331 let header = self.read_header()?;
332 visitor.visit_i32(self.read_integer(header)?)
333 }
334
335 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
336 where
337 V: Visitor<'de>,
338 {
339 let header = self.read_header()?;
340 visitor.visit_i64(self.read_integer(header)?)
341 }
342
343 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
344 where
345 V: Visitor<'de>,
346 {
347 let header = self.read_header()?;
348 visitor.visit_u8(self.read_integer(header)?)
349 }
350
351 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
352 where
353 V: Visitor<'de>,
354 {
355 let header = self.read_header()?;
356 visitor.visit_u16(self.read_integer(header)?)
357 }
358
359 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
360 where
361 V: Visitor<'de>,
362 {
363 let header = self.read_header()?;
364 visitor.visit_u32(self.read_integer(header)?)
365 }
366
367 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
368 where
369 V: Visitor<'de>,
370 {
371 let header = self.read_header()?;
372 visitor.visit_u64(self.read_integer(header)?)
373 }
374
375 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
376 where
377 V: Visitor<'de>,
378 {
379 let header = self.read_header()?;
380 if header.element_type == ElementType::Null {
381 visitor.visit_none()
382 } else {
383 let mut deser = self.with_header(header);
384 visitor.visit_some(&mut deser)
385 }
386 }
387
388 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
389 where
390 V: Visitor<'de>,
391 {
392 let header = self.read_header()?;
393 self.read_null(header)?;
394 visitor.visit_unit()
395 }
396
397 fn deserialize_unit_struct<V>(
398 self,
399 _name: &'static str,
400 visitor: V,
401 ) -> Result<V::Value>
402 where
403 V: Visitor<'de>,
404 {
405 self.deserialize_unit(visitor)
406 }
407
408 fn deserialize_newtype_struct<V>(
409 self,
410 _name: &'static str,
411 visitor: V,
412 ) -> Result<V::Value>
413 where
414 V: Visitor<'de>,
415 {
416 visitor.visit_newtype_struct(self)
417 }
418
419 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
420 where
421 V: Visitor<'de>,
422 {
423 let head = self.read_header()?;
424 let reader = self.reader_with_limit(head)?;
425 let mut seq_deser = Deserializer { reader };
426 visitor.visit_seq(&mut seq_deser)
427 }
428
429 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
430 where
431 V: Visitor<'de>,
432 {
433 self.deserialize_seq(visitor)
434 }
435
436 fn deserialize_tuple_struct<V>(
437 self,
438 _name: &'static str,
439 _len: usize,
440 visitor: V,
441 ) -> Result<V::Value>
442 where
443 V: Visitor<'de>,
444 {
445 self.deserialize_seq(visitor)
446 }
447
448 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
449 where
450 V: Visitor<'de>,
451 {
452 let head = self.read_header()?;
453 let reader = self.reader_with_limit(head)?;
454 let mut seq_deser = Deserializer { reader };
455 visitor.visit_map(&mut seq_deser)
456 }
457
458 fn deserialize_struct<V>(
459 self,
460 _name: &'static str,
461 _fields: &'static [&'static str],
462 visitor: V,
463 ) -> Result<V::Value>
464 where
465 V: Visitor<'de>,
466 {
467 self.deserialize_map(visitor)
468 }
469
470 fn deserialize_enum<V>(
471 self,
472 _name: &'static str,
473 _variants: &'static [&'static str],
474 visitor: V,
475 ) -> Result<V::Value>
476 where
477 V: Visitor<'de>,
478 {
479 let header = self.read_header()?;
480 match header.element_type {
481 ElementType::Text
482 | ElementType::TextJ
483 | ElementType::Text5
484 | ElementType::TextRaw => {
485 let s = self.read_string(header)?;
486 visitor.visit_enum(s.into_deserializer())
487 }
488 ElementType::Object => {
489 let reader = self.reader_with_limit(header)?;
490 let mut de = Deserializer { reader };
491 let r = visitor.visit_enum(&mut de);
492 if de.reader.read(&mut [0])? == 0 {
493 r
494 } else {
495 Err(Error::TrailingCharacters)
496 }
497 }
498 other => Err(Error::UnexpectedType(other)),
499 }
500 }
501
502 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
503 where
504 V: Visitor<'de>,
505 {
506 self.deserialize_str(visitor)
507 }
508
509 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
510 where
511 V: Visitor<'de>,
512 {
513 let header = self.read_header()?;
514 self.drop_payload(header)?;
515 visitor.visit_unit()
516 }
517
518 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
519 where
520 V: Visitor<'de>,
521 {
522 let header = self.read_header()?;
523 visitor.visit_f32(self.read_float(header)?)
524 }
525
526 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
527 where
528 V: Visitor<'de>,
529 {
530 let header = self.read_header()?;
531 visitor.visit_f64(self.read_float(header)?)
532 }
533
534 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
535 where
536 V: Visitor<'de>,
537 {
538 let header = self.read_header()?;
539 let s = self.read_string(header)?;
540 if s.len() != 1 {
541 return Err(Error::Message(
542 "invalid string length for char".into(),
543 ));
544 }
545 visitor.visit_char(s.chars().next().unwrap())
546 }
547
548 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
549 where
550 V: Visitor<'de>,
551 {
552 self.deserialize_string(visitor)
554 }
555
556 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
557 where
558 V: Visitor<'de>,
559 {
560 let header = self.read_header()?;
561 visitor.visit_string(self.read_string(header)?)
562 }
563
564 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
565 where
566 V: Visitor<'de>,
567 {
568 self.deserialize_seq(visitor)
569 }
570
571 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
572 where
573 V: Visitor<'de>,
574 {
575 self.deserialize_seq(visitor)
576 }
577}
578
579impl<'de, 'a, R: Read> de::SeqAccess<'de> for &'a mut Deserializer<R> {
580 type Error = Error;
581
582 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
583 where
584 T: de::DeserializeSeed<'de>,
585 {
586 match seed.deserialize(&mut **self) {
587 Ok(v) => Ok(Some(v)),
588 Err(Error::Empty) => Ok(None),
589 Err(e) => Err(e),
590 }
591 }
592}
593
594impl<'de, 'a, R: Read> de::MapAccess<'de> for &'a mut Deserializer<R> {
595 type Error = Error;
596
597 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
598 where
599 K: de::DeserializeSeed<'de>,
600 {
601 self.next_element_seed(seed)
602 }
603
604 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
605 where
606 V: de::DeserializeSeed<'de>,
607 {
608 self.next_element_seed(seed)
609 .and_then(|opt| opt.ok_or_else(|| Error::Empty))
610 }
611}
612
613impl<'de, 'a, R: Read> de::EnumAccess<'de> for &'a mut Deserializer<R> {
614 type Error = Error;
615 type Variant = Self;
616
617 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
618 where
619 V: de::DeserializeSeed<'de>,
620 {
621 let val = seed.deserialize(&mut *self)?;
622 Ok((val, self))
623 }
624}
625
626impl<'de, 'a, R: Read> de::VariantAccess<'de> for &'a mut Deserializer<R> {
627 type Error = Error;
628
629 fn unit_variant(self) -> Result<()> {
630 Ok(())
631 }
632
633 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
634 where
635 T: de::DeserializeSeed<'de>,
636 {
637 seed.deserialize(self)
638 }
639
640 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
641 where
642 V: Visitor<'de>,
643 {
644 de::Deserializer::deserialize_seq(self, visitor)
645 }
646
647 fn struct_variant<V>(
648 self,
649 _fields: &'static [&'static str],
650 visitor: V,
651 ) -> Result<V::Value>
652 where
653 V: Visitor<'de>,
654 {
655 de::Deserializer::deserialize_map(self, visitor)
656 }
657}
658#[cfg(test)]
659mod tests {
660 use super::*;
661
662 fn assert_header(bytes: &[u8], expected: Header) {
663 let mut de = Deserializer::from_bytes(bytes);
664 let header = de.read_header().unwrap();
665 assert_eq!(header, expected);
666 }
667
668 #[test]
669 fn test_read_header() {
670 assert_header(
671 &[0b_0000_0000],
672 Header {
673 element_type: ElementType::Null,
674 payload_size: 0,
675 },
676 );
677 assert_header(
678 &[0b_0000_0001],
679 Header {
680 element_type: ElementType::True,
681 payload_size: 0,
682 },
683 );
684 assert_header(
685 &[0b_0000_0010],
686 Header {
687 element_type: ElementType::False,
688 payload_size: 0,
689 },
690 );
691 assert_header(
692 &[0b_1100_0011, 0xFA],
693 Header {
694 element_type: ElementType::Int,
695 payload_size: 0xFA,
696 },
697 );
698 assert_header(
699 b"\xf3\x00\x00\x00\x00\x00\x00\x00\x01",
700 Header {
701 element_type: ElementType::Int,
702 payload_size: 1,
703 },
704 );
705 assert_header(
706 b"\xbb",
707 Header {
708 element_type: ElementType::Array,
709 payload_size: 11,
710 },
711 );
712 }
713
714 fn assert_all_int_types_eq(encoded: &[u8], expected: i64) {
715 assert_eq!(
717 from_slice::<i8>(encoded).unwrap(),
718 expected as i8,
719 "parsing {encoded:?} as i8"
720 );
721 assert_eq!(from_slice::<i16>(encoded).unwrap(), expected as i16);
722 assert_eq!(from_slice::<i32>(encoded).unwrap(), expected as i32);
723 assert_eq!(from_slice::<i64>(encoded).unwrap(), expected);
724 assert_eq!(from_slice::<u8>(encoded).unwrap(), expected as u8);
726 assert_eq!(from_slice::<u16>(encoded).unwrap(), expected as u16);
727 assert_eq!(from_slice::<u32>(encoded).unwrap(), expected as u32);
728 assert_eq!(from_slice::<u64>(encoded).unwrap(), expected as u64);
729 }
730
731 #[test]
732 fn test_decoding_1() {
733 assert_all_int_types_eq(b"\x13\x31", 1);
742 assert_all_int_types_eq(b"\xc3\x01\x31", 1);
743 assert_all_int_types_eq(b"\xd3\x00\x01\x31", 1);
744 assert_all_int_types_eq(b"\xe3\x00\x00\x00\x01\x31", 1);
745 assert_all_int_types_eq(b"\xf3\x00\x00\x00\x00\x00\x00\x00\x01\x31", 1);
746 assert_all_int_types_eq(b"\xc3\x03127", 127);
747 }
748
749 #[test]
750 fn test_decoding_large_int() {
751 assert_eq!(
752 from_slice::<u64>(b"\xc3\xf418446744073709551615").unwrap(),
753 18446744073709551615
754 );
755 assert_eq!(
757 from_slice::<i64>(b"\xc3\xf5-9223372036854775808").unwrap(),
758 -9223372036854775808
759 );
760 }
761
762 #[test]
763 fn test_decoding_large_float() {
764 assert_eq!(
766 from_slice::<f64>(b"\xc5\x0c-0.123456789").unwrap(),
767 -0.123456789
768 );
769 }
770
771 #[test]
772 fn test_decoding_int_as_float() {
773 assert_eq!(from_slice::<f32>(b"\xc3\x0512345").unwrap(), 12345.);
775 }
776
777 #[test]
778 fn test_null() {
779 from_slice::<()>(b"\x00").unwrap();
780 }
781
782 #[test]
783 fn test_option() {
784 assert_eq!(from_slice::<Option<u64>>(b"\x00").unwrap(), None);
785 assert_eq!(from_slice::<Option<Vec<u8>>>(b"\x00").unwrap(), None);
786 assert_eq!(from_slice::<Option<u8>>(b"\x2342").unwrap(), Some(42));
787 }
788
789 #[test]
790 fn test_string_noescape() {
791 assert_eq!(from_slice::<String>(b"\x57hello").unwrap(), "hello");
792 }
793
794 #[test]
795 fn test_string_json_escape() {
796 assert_eq!(from_slice::<String>(b"\x28\\n").unwrap(), "\n");
797 }
798
799 #[test]
800 #[cfg(feature = "serde_json5")]
801 fn test_string_json5_escape() {
802 assert_eq!(from_slice::<String>(b"\x49\\x0A").unwrap(), "\n");
803 }
804
805 #[test]
806 fn test_tuple() {
807 assert_eq!(
808 from_slice::<(u8, i64, char)>(b"\x6b\x131\x132\x18x").unwrap(),
809 (1, 2, 'x')
810 );
811 }
812
813 #[test]
814 fn test_tuple_struct() {
815 #[derive(Debug, PartialEq, serde_derive::Deserialize)]
816 struct Test(Option<String>, bool, bool);
817 assert_eq!(
818 from_slice::<Test>(b"\x3b\x00\x01\x02").unwrap(),
819 Test(None, true, false)
820 );
821 }
822
823 #[test]
824 fn test_vec() {
825 assert_eq!(from_slice::<Vec<()>>(b"\x0b").unwrap(), vec![]);
826 assert_eq!(
827 from_slice::<Vec<u8>>(b"\x4b\x131\x132").unwrap(),
828 vec![1, 2]
829 );
830 }
831
832 #[test]
833 fn test_vec_opts() {
834 assert_eq!(
835 from_slice::<Vec<Option<String>>>(b"\xbb\x471234\x00\x475678")
836 .unwrap(),
837 vec![Some("1234".to_string()), None, Some("5678".to_string())]
838 );
839 }
840
841 #[test]
842 fn test_vec_with_reader() {
843 assert_eq!(from_reader::<_, Vec<()>>(&b"\x0b"[..]).unwrap(), vec![]);
844 }
845
846 #[test]
847 fn test_vec_of_vecs() {
848 assert_eq!(
849 from_slice::<Vec<Vec<i16>>>(
850 b"\xcb\x0a\x4b\x131\x132\x4b\x133\x134"
851 )
852 .unwrap(),
853 vec![vec![1, 2], vec![3, 4]]
854 );
855 }
856
857 #[test]
858 fn test_hashmap() {
859 use std::collections::HashMap;
860 let actual =
861 from_slice::<HashMap<String, bool>>(b"\x6c\x17a\x02\x17b\x01")
862 .unwrap();
863 let expected = [("a".into(), false), ("b".into(), true)]
864 .into_iter()
865 .collect();
866 assert_eq!(actual, expected);
867 }
868
869 #[test]
870 fn test_struct() {
871 #[derive(Debug, PartialEq, serde_derive::Deserialize)]
872 struct Test {
873 a: bool,
874 b: bool,
875 }
876 let actual = from_slice::<Test>(b"\x6c\x17a\x02\x17b\x01").unwrap();
877 let expected = Test { a: false, b: true };
878 assert_eq!(actual, expected);
879 }
880
881 #[test]
882 fn test_complex_struct() {
883 let bytes = b"\xcc\x3a\x27id\x131\x47name\x87John Doe\xc7\x0dphone_numbers\xbb\x471234\x00\x475678\x47data\x6b\x131\x132\x133";
884 let mut deser = Deserializer::from_bytes(bytes);
885 #[derive(Debug, PartialEq, serde_derive::Deserialize)]
886 struct Person {
887 id: i32,
888 name: String,
889 phone_numbers: Vec<Option<String>>,
890 data: Vec<u8>,
891 }
892 let person: Person = Person::deserialize(&mut deser).unwrap();
893 assert_eq!(
894 person,
895 Person {
896 id: 1,
897 name: "John Doe".to_string(),
898 phone_numbers: vec![
899 Some("1234".to_string()),
900 None,
901 Some("5678".to_string())
902 ],
903 data: vec![1, 2, 3]
904 }
905 );
906 }
907
908 #[test]
909 fn test_basic_enum() {
910 #[derive(Debug, PartialEq, serde_derive::Deserialize)]
911 enum Test {
912 X,
913 Y,
914 }
915 let actual: Vec<Test> = from_slice(b"\x4b\x18X\x18Y").unwrap();
916 let expected = vec![Test::X, Test::Y];
917 assert_eq!(actual, expected);
918 }
919
920 #[test]
921 fn test_externally_tagged_enum() {
922 #[derive(Debug, PartialEq, serde_derive::Deserialize)]
923 enum Test {
924 X(String),
925 Y(bool),
926 }
927 let actual: Test = from_slice(b"\x4c\x18X\x18Y").unwrap();
929 let expected = Test::X("Y".to_string());
930 assert_eq!(actual, expected);
931 }
932
933 #[test]
934 fn test_externally_tagged_enum_too_large() {
935 #[derive(Debug, PartialEq, serde_derive::Deserialize)]
936 enum Test {
937 X(char),
938 Y(char),
939 }
940 assert_eq!(
941 from_slice::<Vec<Test>>(b"\x9b\x8c\x18X\x18Y\x18Y\x18A")
942 .unwrap_err()
943 .to_string(),
944 Error::TrailingCharacters.to_string()
945 );
946 }
947}