1use core::convert::TryInto;
2
3use serde_core as serde;
4
5use serde::de::{self, Deserialize, DeserializeSeed, IntoDeserializer, Visitor};
6
7use super::error::{Error, Result};
8use crate::consts::*;
9
10pub fn from_bytes<'a, T>(s: &'a [u8]) -> Result<T>
13where
14 T: Deserialize<'a>,
15{
16 let mut deserializer = Deserializer::from_bytes(s);
17 let t = T::deserialize(&mut deserializer)?;
18 Ok(t)
19}
20
21pub fn take_from_bytes<'a, T>(s: &'a [u8]) -> Result<(T, &'a [u8])>
24where
25 T: Deserialize<'a>,
26{
27 let mut deserializer = Deserializer::from_bytes(s);
28 let t = T::deserialize(&mut deserializer)?;
29 Ok((t, deserializer.input))
30}
31
32pub struct Deserializer<'de> {
36 pub(crate) input: &'de [u8],
39}
40
41impl<'de> Deserializer<'de> {
42 pub fn from_bytes(input: &'de [u8]) -> Self {
44 Deserializer { input }
45 }
46}
47
48impl<'de> Deserializer<'de> {
49 fn try_take_n(&mut self, count: usize) -> Result<&'de [u8]> {
50 if self.input.len() >= count {
51 let (a, b) = self.input.split_at(count);
52 self.input = b;
53 Ok(a)
54 } else {
55 Err(Error::DeserializeUnexpectedEnd)
56 }
57 }
58
59 fn peek_major(&mut self) -> Result<u8> {
60 if !self.input.is_empty() {
61 let byte = self.input[0];
62 Ok(byte >> MAJOR_OFFSET)
63 } else {
64 Err(Error::DeserializeUnexpectedEnd)
65 }
66 }
67
68 fn peek(&mut self) -> Result<u8> {
69 if !self.input.is_empty() {
70 Ok(self.input[0])
71 } else {
72 Err(Error::DeserializeUnexpectedEnd)
73 }
74 }
75
76 fn consume(&mut self) -> Result<u8> {
77 if !self.input.is_empty() {
78 let ret = self.input[0];
79 self.input = &self.input[1..];
80 Ok(ret)
81 } else {
82 Err(Error::DeserializeUnexpectedEnd)
83 }
84 }
85
86 fn expect_major(&mut self, major: u8) -> Result<u8> {
87 let byte = self.try_take_n(1)?[0];
88 if major != (byte >> MAJOR_OFFSET) {
89 return Err(Error::DeserializeBadMajor);
92 }
93 Ok(byte & ((1 << MAJOR_OFFSET) - 1))
94 }
95
96 fn raw_deserialize_u8(&mut self, major: u8) -> Result<u8> {
98 let additional = self.expect_major(major)?;
99
100 match additional {
101 byte @ 0..=23 => Ok(byte),
102 24 => match self.try_take_n(1)?[0] {
103 0..=23 => Err(Error::DeserializeNonMinimal),
104 byte => Ok(byte),
105 },
106 _ => Err(Error::DeserializeBadU8),
107 }
108 }
109
110 fn raw_deserialize_u16(&mut self, major: u8) -> Result<u16> {
111 let number = self.raw_deserialize_u32(major)?;
112 if number <= u16::MAX as u32 {
113 Ok(number as u16)
114 } else {
115 Err(Error::DeserializeBadU16)
116 }
117 }
118
119 fn raw_deserialize_u32(&mut self, major: u8) -> Result<u32> {
120 let additional = self.expect_major(major)?;
121
122 match additional {
123 byte @ 0..=23 => Ok(byte as u32),
124 24 => match self.try_take_n(1)?[0] {
125 0..=23 => Err(Error::DeserializeNonMinimal),
126 byte => Ok(byte as u32),
127 },
128 25 => {
129 let unsigned = u16::from_be_bytes(
130 self.try_take_n(2)?
131 .try_into()
132 .map_err(|_| Error::InexistentSliceToArrayError)?,
133 );
134 match unsigned {
135 0..=255 => Err(Error::DeserializeNonMinimal),
136 unsigned => Ok(unsigned as u32),
137 }
138 }
139 26 => {
140 let unsigned = u32::from_be_bytes(
141 self.try_take_n(4)?
142 .try_into()
143 .map_err(|_| Error::InexistentSliceToArrayError)?,
144 );
145 match unsigned {
146 0..=65535 => Err(Error::DeserializeNonMinimal),
147 unsigned => Ok(unsigned),
148 }
149 }
150 _ => Err(Error::DeserializeBadU32),
151 }
152 }
153 fn raw_deserialize_u64(&mut self, major: u8) -> Result<u64> {
154 let additional = self.expect_major(major)?;
155
156 match additional {
157 byte @ 0..=23 => Ok(byte as u64),
158 24 => match self.try_take_n(1)?[0] {
159 0..=23 => Err(Error::DeserializeNonMinimal),
160 byte => Ok(byte as u64),
161 },
162 25 => {
163 let unsigned = u16::from_be_bytes(
164 self.try_take_n(2)?
165 .try_into()
166 .map_err(|_| Error::InexistentSliceToArrayError)?,
167 );
168 match unsigned {
169 0..=255 => Err(Error::DeserializeNonMinimal),
170 unsigned => Ok(unsigned as u64),
171 }
172 }
173 26 => {
174 let unsigned = u32::from_be_bytes(
175 self.try_take_n(4)?
176 .try_into()
177 .map_err(|_| Error::InexistentSliceToArrayError)?,
178 );
179 match unsigned {
180 0..=65535 => Err(Error::DeserializeNonMinimal),
181 unsigned => Ok(unsigned as u64),
182 }
183 }
184 27 => {
185 let unsigned = u64::from_be_bytes(
186 self.try_take_n(8)?
187 .try_into()
188 .map_err(|_| Error::InexistentSliceToArrayError)?,
189 );
190 match unsigned {
191 0..=0xFFFFFFFF => Err(Error::DeserializeNonMinimal),
192 unsigned => Ok(unsigned),
193 }
194 }
195 _ => Err(Error::DeserializeBadU64),
196 }
197 }
198
199 fn ignore_int(&mut self, major: u8) -> Result<()> {
200 let additional = self.expect_major(major)?;
201 match additional {
202 0..=23 => {}
203 24 => {
204 self.try_take_n(1)?;
205 }
206 25 => {
207 self.try_take_n(2)?;
208 }
209 26 => {
210 self.try_take_n(4)?;
211 }
212 27 => {
213 self.try_take_n(8)?;
214 }
215 _ => return Err(Error::DeserializeBadU16),
216 };
217 Ok(())
218 }
219
220 fn ignore_bytes(&mut self, major: u8) -> Result<()> {
221 let length = self.raw_deserialize_u32(major)? as usize;
222 self.try_take_n(length)?;
223 Ok(())
224 }
225
226 fn ignore_array(&mut self, major: u8, mult: usize) -> Result<()> {
227 let length = self.raw_deserialize_u32(major)? as usize;
228 let Some(real_length) = length.checked_mul(mult) else {
229 return Err(Error::InexistentSliceToArrayError);
230 };
231 for _ in 0..real_length {
232 self.ignore()?;
233 }
234 Ok(())
235 }
236
237 fn ignore_float(&mut self) -> Result<()> {
238 let additional = self.expect_major(7)?;
239 match additional {
240 0..=23 => {}
241 24 => {
242 self.try_take_n(1)?;
243 }
244 25 => {
245 self.try_take_n(2)?;
246 }
247 26 => {
248 self.try_take_n(4)?;
249 }
250 27 => {
251 self.try_take_n(8)?;
252 }
253 _ => return Err(Error::DeserializeBadMajor),
254 };
255 Ok(())
256 }
257
258 fn ignore(&mut self) -> Result<()> {
259 let major = self.peek_major()?;
260 match major {
261 MAJOR_POSINT | MAJOR_NEGINT => self.ignore_int(major)?,
262 MAJOR_BYTES | MAJOR_STR => self.ignore_bytes(major)?,
263 MAJOR_ARRAY => self.ignore_array(MAJOR_ARRAY, 1)?,
264 MAJOR_MAP => self.ignore_array(MAJOR_MAP, 2)?,
265 6 => {
266 self.ignore_int(6)?;
267 self.ignore()?;
268 }
269 MAJOR_FLOAT => self.ignore_float()?,
270 _ => return Err(Error::DeserializeBadMajor),
271 }
272 Ok(())
273 }
274
275 }
293
294struct SeqAccess<'a, 'b: 'a> {
295 deserializer: &'a mut Deserializer<'b>,
296 len: usize,
297}
298
299impl<'a, 'b: 'a> serde::de::SeqAccess<'b> for SeqAccess<'a, 'b> {
300 type Error = Error;
301
302 fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>>
303 where
304 V: DeserializeSeed<'b>,
305 {
306 if self.len > 0 {
307 self.len -= 1;
308 Ok(Some(seed.deserialize(&mut *self.deserializer)?))
309 } else {
310 Ok(None)
311 }
312 }
313
314 fn size_hint(&self) -> Option<usize> {
315 Some(self.len)
316 }
317}
318
319struct MapAccess<'a, 'b: 'a> {
320 deserializer: &'a mut Deserializer<'b>,
321 len: usize,
322}
323
324impl<'a, 'b: 'a> serde::de::MapAccess<'b> for MapAccess<'a, 'b> {
325 type Error = Error;
326
327 fn next_key_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>>
328 where
329 V: DeserializeSeed<'b>,
330 {
331 if self.len > 0 {
332 self.len -= 1;
333 Ok(Some(seed.deserialize(&mut *self.deserializer)?))
334 } else {
335 Ok(None)
336 }
337 }
338
339 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
340 where
341 V: de::DeserializeSeed<'b>,
342 {
343 seed.deserialize(&mut *self.deserializer)
344 }
345
346 fn size_hint(&self) -> Option<usize> {
347 Some(self.len)
348 }
349}
350
351struct EnumAccess<'a, 'b: 'a> {
352 deserializer: &'a mut Deserializer<'b>,
353 variant_len: usize,
354}
355
356impl<'de, 'a> serde::de::VariantAccess<'de> for EnumAccess<'a, 'de> {
357 type Error = Error;
358
359 fn unit_variant(self) -> Result<()> {
360 if self.variant_len != 0 {
361 return Err(Error::DeserializeBadEnum);
362 }
363 Ok(())
364 }
365
366 fn newtype_variant_seed<V: DeserializeSeed<'de>>(self, seed: V) -> Result<V::Value> {
367 if 2 != self.variant_len {
368 return Err(Error::DeserializeBadEnum);
369 }
370 DeserializeSeed::deserialize(seed, self.deserializer)
371 }
372
373 fn tuple_variant<V: Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
374 if len + 1 != self.variant_len {
375 return Err(Error::DeserializeBadEnum);
376 }
377
378 visitor.visit_seq(SeqAccess {
379 deserializer: self.deserializer,
380 len,
381 })
382 }
383
384 fn struct_variant<V: Visitor<'de>>(
385 self,
386 _fields: &'static [&'static str],
387 visitor: V,
388 ) -> Result<V::Value> {
389 if 2 != self.variant_len {
390 return Err(Error::DeserializeBadEnum);
391 }
392 serde::de::Deserializer::deserialize_map(self.deserializer, visitor)
393 }
394}
395
396impl<'de, 'a> serde::de::EnumAccess<'de> for EnumAccess<'a, 'de> {
397 type Error = Error;
398 type Variant = Self;
399
400 fn variant_seed<V: DeserializeSeed<'de>>(self, seed: V) -> Result<(V::Value, Self)> {
401 let discriminant = self.deserializer.raw_deserialize_u32(MAJOR_POSINT)?;
402 let v = DeserializeSeed::deserialize(seed, discriminant.into_deserializer())?;
406 Ok((v, self))
407 }
408}
409
410impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
411 type Error = Error;
412
413 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value>
415 where
416 V: Visitor<'de>,
417 {
418 Err(Error::WontImplement)
421 }
422
423 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
424 where
425 V: Visitor<'de>,
426 {
427 let val = match self.try_take_n(1)?[0] {
428 VALUE_FALSE => false,
429 VALUE_TRUE => true,
430 _ => return Err(Error::DeserializeBadBool),
431 };
432 visitor.visit_bool(val)
433 }
434
435 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
436 where
437 V: Visitor<'de>,
438 {
439 match self.peek_major()? {
440 MAJOR_POSINT => {
441 let raw_u8 = self.raw_deserialize_u8(0)?;
442 if raw_u8 <= i8::MAX as u8 {
443 visitor.visit_i8(raw_u8 as i8)
444 } else {
445 Err(Error::DeserializeBadI8)
446 }
447 }
448 MAJOR_NEGINT => {
449 let raw_u8 = self.raw_deserialize_u8(1)?;
450 if raw_u8 <= 128 {
452 visitor.visit_i8(-1 - (raw_u8 as i16) as i8)
453 } else {
454 Err(Error::DeserializeBadI8)
455 }
456 }
457 _ => Err(Error::DeserializeBadI8),
458 }
459 }
460
461 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
462 where
463 V: Visitor<'de>,
464 {
465 match self.peek_major()? {
466 MAJOR_POSINT => {
467 let raw = self.raw_deserialize_u16(0)?;
468 if raw <= i16::MAX as u16 {
469 visitor.visit_i16(raw as i16)
470 } else {
471 Err(Error::DeserializeBadI16)
472 }
473 }
474 MAJOR_NEGINT => {
475 let raw = self.raw_deserialize_u16(1)?;
476 if raw <= i16::MAX as u16 {
477 visitor.visit_i16(-1 - (raw as i16))
478 } else {
479 Err(Error::DeserializeBadI16)
480 }
481 }
482 _ => Err(Error::DeserializeBadI16),
483 }
484 }
485
486 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
487 where
488 V: Visitor<'de>,
489 {
490 match self.peek_major()? {
491 major @ 0..=1 => {
493 let raw = self.raw_deserialize_u32(major)?;
494 if raw <= i32::MAX as u32 {
495 if major == MAJOR_POSINT {
496 visitor.visit_i32(raw as i32)
497 } else {
498 visitor.visit_i32(-1 - (raw as i32))
499 }
500 } else {
501 Err(Error::DeserializeBadI32)
502 }
503 }
504 _ => Err(Error::DeserializeBadI16),
505 }
506 }
507
508 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
509 where
510 V: Visitor<'de>,
511 {
512 match self.peek_major()? {
513 major @ 0..=1 => {
515 let raw = self.raw_deserialize_u64(major)?;
516 if raw <= i64::MAX as u64 {
517 if major == MAJOR_POSINT {
518 visitor.visit_i64(raw as i64)
519 } else {
520 visitor.visit_i64(-1 - (raw as i64))
521 }
522 } else {
523 Err(Error::DeserializeBadI64)
524 }
525 }
526 _ => Err(Error::DeserializeBadI16),
527 }
528 }
529
530 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
531 where
532 V: Visitor<'de>,
533 {
534 let raw = self.raw_deserialize_u8(MAJOR_POSINT)?;
535 visitor.visit_u8(raw)
536 }
537
538 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
539 where
540 V: Visitor<'de>,
541 {
542 let raw = self.raw_deserialize_u16(MAJOR_POSINT)?;
543 visitor.visit_u16(raw)
544 }
545
546 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
547 where
548 V: Visitor<'de>,
549 {
550 let raw = self.raw_deserialize_u32(MAJOR_POSINT)?;
551 visitor.visit_u32(raw)
552 }
553
554 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
555 where
556 V: Visitor<'de>,
557 {
558 let raw = self.raw_deserialize_u64(MAJOR_POSINT)?;
559 visitor.visit_u64(raw)
560 }
561
562 fn deserialize_f32<V>(self, _visitor: V) -> Result<V::Value>
563 where
564 V: Visitor<'de>,
565 {
566 Err(Error::NotYetImplemented)
567 }
568
569 fn deserialize_f64<V>(self, _visitor: V) -> Result<V::Value>
570 where
571 V: Visitor<'de>,
572 {
573 Err(Error::NotYetImplemented)
574 }
575
576 fn deserialize_char<V>(self, _visitor: V) -> Result<V::Value>
577 where
578 V: Visitor<'de>,
579 {
580 Err(Error::NotYetImplemented)
583 }
589
590 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
591 where
592 V: Visitor<'de>,
593 {
594 let major = self.peek_major()?;
595 match major {
596 MAJOR_ARRAY => {
597 let len = self.raw_deserialize_u32(MAJOR_ARRAY)?;
598 visitor.visit_seq(SeqAccess {
599 deserializer: self,
600 len: len as usize,
601 })
602 }
603 MAJOR_BYTES => {
604 let length = self.raw_deserialize_u32(MAJOR_BYTES)? as usize;
606 let bytes: &'de [u8] = self.try_take_n(length)?;
607 visitor.visit_borrowed_bytes(bytes)
608 }
609 _ => Err(Error::DeserializeBadMajor),
610 }
611 }
612
613 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
614 where
615 V: Visitor<'de>,
616 {
617 self.deserialize_bytes(visitor)
618 }
619
620 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
621 where
622 V: Visitor<'de>,
623 {
624 let length = self.raw_deserialize_u32(MAJOR_STR)? as usize;
626 let bytes: &'de [u8] = self.try_take_n(length)?;
627 let string_slice = core::str::from_utf8(bytes).map_err(|_| Error::DeserializeBadUtf8)?;
628 visitor.visit_borrowed_str(string_slice)
629 }
630
631 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
632 where
633 V: Visitor<'de>,
634 {
635 self.deserialize_str(visitor)
636 }
637
638 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
639 where
640 V: de::Visitor<'de>,
641 {
642 match self.peek()? {
643 0xf6 => {
644 self.consume()?;
645 visitor.visit_none()
646 }
647 _ => visitor.visit_some(self),
648 }
649 }
650
651 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
653 where
654 V: Visitor<'de>,
655 {
656 match self.peek()? {
657 VALUE_NULL => {
658 self.consume()?;
659 visitor.visit_unit()
660 }
661 _ => Err(Error::DeserializeExpectedNull),
662 }
663 }
664
665 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
667 where
668 V: Visitor<'de>,
669 {
670 self.deserialize_unit(visitor)
671 }
672
673 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
674 where
675 V: Visitor<'de>,
676 {
677 visitor.visit_newtype_struct(self)
678 }
679
680 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
681 where
682 V: Visitor<'de>,
683 {
684 let len = self.raw_deserialize_u32(MAJOR_ARRAY)? as usize;
685
686 visitor.visit_seq(SeqAccess {
687 deserializer: self,
688 len,
689 })
690 }
691
692 #[inline(never)]
693 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
694 where
695 V: Visitor<'de>,
696 {
697 let len = self.raw_deserialize_u32(MAJOR_ARRAY)? as usize;
698 visitor.visit_seq(SeqAccess {
699 deserializer: self,
700 len,
701 })
702 }
703
704 fn deserialize_tuple_struct<V>(
705 self,
706 _name: &'static str,
707 len: usize,
708 visitor: V,
709 ) -> Result<V::Value>
710 where
711 V: Visitor<'de>,
712 {
713 self.deserialize_tuple(len, visitor)
714 }
715
716 #[inline(never)]
717 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
718 where
719 V: Visitor<'de>,
720 {
721 let len = self.raw_deserialize_u32(MAJOR_MAP)? as usize;
722
723 visitor.visit_map(MapAccess {
724 deserializer: self,
725 len,
726 })
727 }
728
729 fn deserialize_struct<V>(
730 self,
731 _name: &'static str,
732 _fields: &'static [&'static str],
733 visitor: V,
734 ) -> Result<V::Value>
735 where
736 V: Visitor<'de>,
737 {
738 self.deserialize_map(visitor)
739 }
740
741 fn deserialize_enum<V>(
771 self,
772 _name: &'static str,
773 _variants: &'static [&'static str],
774 visitor: V,
775 ) -> Result<V::Value>
776 where
777 V: Visitor<'de>,
778 {
779 match self.peek_major()? {
780 MAJOR_ARRAY => {
782 let len = self.raw_deserialize_u32(MAJOR_ARRAY)?;
783 visitor.visit_enum(EnumAccess {
784 deserializer: self,
785 variant_len: len as usize,
786 })
787 }
788 MAJOR_POSINT => visitor.visit_enum(EnumAccess {
790 deserializer: self,
791 variant_len: 0,
792 }),
793 _ => Err(Error::DeserializeBadMajor),
794 }
795 }
796
797 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
798 where
799 V: Visitor<'de>,
800 {
801 let major = self.peek_major()?;
802 match major {
803 MAJOR_BYTES | MAJOR_STR => {
804 let length = self.raw_deserialize_u32(major)? as usize;
808 let bytes: &'de [u8] = self.try_take_n(length)?;
809 let string_slice =
810 core::str::from_utf8(bytes).map_err(|_| Error::DeserializeBadUtf8)?;
811 visitor.visit_borrowed_str(string_slice)
812 }
813 MAJOR_POSINT => self.deserialize_u64(visitor),
814 _ => Err(Error::DeserializeBadMajor),
815 }
816 }
817
818 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
819 where
820 V: Visitor<'de>,
821 {
822 self.ignore()?;
824 visitor.visit_none()
825 }
826}
827
828#[cfg(test)]
907mod tests {
908
909 use super::from_bytes;
911
912 use crate::{cbor_deserialize, cbor_serialize};
915
916 #[test]
917 fn de_bool() {
918 let mut buf = [0u8; 64];
919
920 for boolean in [true, false].iter() {
921 let _n = cbor_serialize(boolean, &mut buf).unwrap();
922 let de: bool = from_bytes(&buf).unwrap();
923 assert_eq!(de, *boolean);
924 }
925 }
926
927 #[test]
928 fn de_u8() {
929 let mut buf = [0u8; 64];
930
931 for number in 0..=255 {
932 println!("testing {}", number);
933 let _n = cbor_serialize(&number, &mut buf).unwrap();
934 let de: u8 = from_bytes(&buf).unwrap();
935 assert_eq!(de, number);
936 }
937 }
938
939 #[test]
940 fn de_i8() {
941 let mut buf = [0u8; 64];
942
943 for number in -128i8..=127 {
944 println!("testing {}", number);
945 let ser = cbor_serialize(&number, &mut buf).unwrap();
946 println!("serialized: {:?}", ser);
947 let de: i8 = cbor_deserialize(ser).unwrap();
948 assert_eq!(de, number);
949 }
950 }
951
952 #[test]
953 fn de_u16() {
954 let mut buf = [0u8; 64];
955
956 for number in 0..=65535 {
957 println!("testing {}", number);
958 let _n = cbor_serialize(&number, &mut buf).unwrap();
959 let de: u16 = from_bytes(&buf).unwrap();
960 assert_eq!(de, number);
961 }
962 }
963
964 #[test]
965 fn de_i16() {
966 let mut buf = [0u8; 64];
967
968 for number in i16::min_value()..=i16::MAX {
969 println!("testing {}", number);
970 let _n = cbor_serialize(&number, &mut buf).unwrap();
971 let de: i16 = from_bytes(&buf).unwrap();
972 assert_eq!(de, number);
973 }
974 }
975
976 #[test]
977 fn de_u32() {
978 let mut buf = [0u8; 64];
979
980 for number in 0..=3 * (u16::MAX as u32) {
981 println!("testing {}", number);
982 let _n = cbor_serialize(&number, &mut buf).unwrap();
983 let de: u32 = from_bytes(&buf).unwrap();
984 assert_eq!(de, number);
985 }
986
987 for number in (u32::MAX - u16::MAX as u32)..=u32::MAX {
988 println!("testing {}", number);
989 let _n = cbor_serialize(&number, &mut buf).unwrap();
990 let de: u32 = from_bytes(&buf).unwrap();
991 assert_eq!(de, number);
992 }
993 }
994
995 #[test]
996 fn de_u64() {
997 let mut buf = [0u8; 64];
998
999 let numbers = [
1000 0,
1001 1,
1002 2,
1003 3,
1004 u16::MAX as u64,
1005 u16::MAX as u64 + 1,
1006 u32::MAX as u64,
1007 u32::MAX as u64 + 1,
1008 u64::MAX - 1,
1009 u64::MAX,
1010 ];
1011
1012 for number in numbers {
1013 println!("testing {}", number);
1014 let _n = cbor_serialize(&number, &mut buf).unwrap();
1015 let de: u64 = from_bytes(&buf).unwrap();
1016 assert_eq!(de, number);
1017 }
1018 }
1019
1020 #[test]
1021 fn de_i32() {
1022 let mut buf = [0u8; 64];
1023
1024 let number: i32 = -98304;
1025 let ser = cbor_serialize(&number, &mut buf).unwrap();
1026 println!("serialized number: {:?} of {}", ser, i16::min_value());
1027 let de: i32 = from_bytes(ser).unwrap();
1028 assert_eq!(de, number);
1029
1030 for number in (3 * i16::min_value() as i32)..=3 * (i16::MAX as i32) {
1031 println!("testing {}", number);
1032 let ser = cbor_serialize(&number, &mut buf).unwrap();
1033 let de: i32 = from_bytes(ser).unwrap();
1034 assert_eq!(de, number);
1035 }
1036
1037 for number in (i32::MAX - i16::MAX as i32)..=i32::MAX {
1038 println!("testing {}", number);
1039 let ser = cbor_serialize(&number, &mut buf).unwrap();
1040 let de: i32 = from_bytes(ser).unwrap();
1041 assert_eq!(de, number);
1042 }
1043
1044 for number in i32::min_value()..=(i32::min_value() - i16::min_value() as i32) {
1045 println!("testing {}", number);
1046 let ser = cbor_serialize(&number, &mut buf).unwrap();
1047 let de: i32 = from_bytes(ser).unwrap();
1048 assert_eq!(de, number);
1049 }
1050 }
1051
1052 #[cfg_attr(
1053 not(feature = "heapless-bytes-v0-5"),
1054 ignore = "Enable heapless-bytes-v0-5 feature"
1055 )]
1056 #[test]
1057 fn de_bytes() {
1058 #[cfg(feature = "heapless-bytes-v0-5")]
1059 {
1060 let mut buf = [0u8; 64];
1061
1062 let slice = b"thank you postcard!";
1063 let bytes = heapless_bytes_v0_5::Bytes::<64>::try_from(slice).unwrap();
1064 let ser = cbor_serialize(&bytes, &mut buf).unwrap();
1065 println!("serialized bytes = {:?}", ser);
1066 let de: heapless_bytes_v0_5::Bytes<64> = from_bytes(&buf).unwrap();
1067 println!("deserialized bytes = {:?}", &de);
1068 assert_eq!(&de, slice);
1069 }
1070 #[cfg(not(feature = "heapless-bytes-v0-5"))]
1071 {
1072 panic!("This test must be run with the heapless-v0-5 feature")
1073 }
1074 }
1075
1076 #[test]
1077 fn de_str() {
1078 let mut buf = [0u8; 64];
1079
1080 let string_slice = "thank you postcard, for blazing the path 🐝";
1081 let mut string = heapless_v0_9::String::<64>::new();
1082 string.push_str(string_slice).unwrap();
1083 let _n = cbor_serialize(&string, &mut buf);
1084 let de: heapless_v0_9::String<64> = from_bytes(&buf).unwrap();
1085 assert_eq!(de, string_slice);
1086 }
1087
1088 #[test]
1133 fn de_enum() {
1134 let mut buf = [0u8; 64];
1135 let e = Some(3);
1136 let ser = cbor_serialize(&e, &mut buf).unwrap();
1137 println!("ser(Some(3)) = {:?}", ser);
1138 let de: Option<u8> = cbor_deserialize(ser).unwrap();
1139 assert_eq!(de, e);
1140 let e: Option<u8> = None;
1141 println!(
1142 "ser({:?}) = {:x?}",
1143 &e,
1144 cbor_serialize(&e, &mut buf).unwrap()
1145 );
1146
1147 use serde::{Deserialize, Serialize};
1153 #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
1154 pub enum Enum {
1155 Alpha(u8),
1156 Beta((i32, u32)),
1157 Gamma { a: i32, b: u32 },
1158 }
1159
1160 let mut buf = [0u8; 64];
1161
1162 let e = Enum::Beta((-42, 7));
1163 let ser = cbor_serialize(&e, &mut buf).unwrap();
1164 println!("ser({:?}) = {:?}", &e, ser);
1165 let de: Enum = cbor_deserialize(ser).unwrap();
1166 assert_eq!(de, e);
1167
1168 let e = Enum::Gamma { a: -42, b: 7 };
1169 let ser = cbor_serialize(&e, &mut buf).unwrap();
1170 println!("ser({:?}) = {:?}", &e, ser);
1171 let de: Enum = cbor_deserialize(ser).unwrap();
1172 assert_eq!(de, e);
1173
1174 #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
1175 pub enum SimpleEnum {
1176 Alpha(u8),
1177 Beta,
1178 }
1179
1180 let e = SimpleEnum::Alpha(7);
1181 let ser = cbor_serialize(&e, &mut buf).unwrap();
1182 println!("ser({:?}) = {:?}", &e, ser);
1183 let de: SimpleEnum = cbor_deserialize(ser).unwrap();
1184 assert_eq!(de, e);
1185
1186 let e = SimpleEnum::Beta;
1187 let ser = cbor_serialize(&e, &mut buf).unwrap();
1188 println!("ser({:?}) = {:?}", &e, ser);
1189 let de: SimpleEnum = cbor_deserialize(ser).unwrap();
1190 assert_eq!(de, e);
1191 }
1192
1193 #[test]
1194 fn de_ignored_any() {
1195 use serde::de::IgnoredAny;
1196 use serde::{Deserialize, Serialize};
1197
1198 #[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
1199 pub struct ValOuter<'a> {
1200 inner: Outer<'a>,
1201 val: &'a str,
1202 }
1203 #[derive(Deserialize)]
1204 pub struct ValIgnored<'a> {
1205 #[allow(unused)]
1206 inner: IgnoredAny,
1207 val: &'a str,
1208 }
1209
1210 #[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
1211 pub struct Inner<'a> {
1212 u8: u8,
1213 u16: u16,
1214 u32: u32,
1215 u64: u64,
1216 i8: i8,
1217 i16: i16,
1218 i32: i32,
1219 i64: i64,
1220 str: &'a str,
1221 option: Option<&'a str>,
1222 #[serde(with = "serde_bytes")]
1223 bytes: &'a [u8],
1224 unit: (),
1225 }
1226 #[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug)]
1227 pub struct Outer<'a> {
1228 u8: u8,
1229 u16: u16,
1230 u32: u32,
1231 u64: u64,
1232 i8: i8,
1233 i16: i16,
1234 i32: i32,
1235 i64: i64,
1236 str: &'a str,
1237 #[serde(with = "serde_bytes")]
1238 bytes: &'a [u8],
1239 unit: (),
1240 option: Option<&'a str>,
1241 nested: Inner<'a>,
1242 }
1243
1244 let mut buf = [0; 1024];
1245 let val = Outer {
1246 u8: u8::MAX,
1247 u16: u16::MAX,
1248 u32: u32::MAX,
1249 u64: u64::MAX,
1250 i8: i8::MIN,
1251 i16: i16::MIN,
1252 i32: i32::MIN,
1253 i64: i64::MIN,
1254 str: "string",
1255 bytes: b"bytes",
1256 unit: (),
1257 option: Some("option"),
1258 nested: Inner {
1259 u8: 0,
1260 u16: 0,
1261 u32: 0,
1262 u64: 0,
1263 i8: i8::MIN,
1264 i16: i16::MIN,
1265 i32: i32::MIN,
1266 i64: i64::MIN,
1267 str: "",
1268 option: None,
1269 bytes: b"",
1270 unit: (),
1271 },
1272 };
1273 let ser = cbor_serialize(&val, &mut buf).unwrap();
1274 let _: IgnoredAny = cbor_deserialize(ser).unwrap();
1275
1276 let val = ValOuter {
1277 inner: val,
1278 val: "value",
1279 };
1280 let ser = cbor_serialize(&val, &mut buf).unwrap();
1281 let de: ValOuter = cbor_deserialize(ser).unwrap();
1282 assert_eq!(val, de);
1283 let de: ValIgnored = cbor_deserialize(ser).unwrap();
1284 assert_eq!(de.val, "value");
1285 }
1286
1287 }