1#[cfg(feature = "std")]
2use alloc::vec;
3
4use crate::Error;
5use crate::FromMessagePack;
6use crate::Result;
7use crate::consts::*;
8
9pub const MAX_DEPTH: usize = 500;
11
12pub enum Tag<'de> {
14 Int(u64),
15 String(alloc::borrow::Cow<'de, str>),
16}
17
18pub trait Read<'de> {
20 fn increment_depth(&mut self) -> Result<()>;
57
58 fn decrement_depth(&mut self);
61
62 fn read_nil(&mut self) -> Result<()>;
64
65 fn read_boolean(&mut self) -> Result<bool>;
67
68 fn read_u8(&mut self) -> Result<u8>;
70
71 fn read_u16(&mut self) -> Result<u16>;
73
74 fn read_u32(&mut self) -> Result<u32>;
76
77 fn read_u64(&mut self) -> Result<u64>;
79
80 fn read_i8(&mut self) -> Result<i8>;
82
83 fn read_i16(&mut self) -> Result<i16>;
85
86 fn read_i32(&mut self) -> Result<i32>;
88
89 fn read_i64(&mut self) -> Result<i64>;
91
92 fn read_f32(&mut self) -> Result<f32>;
94
95 fn read_f64(&mut self) -> Result<f64>;
97
98 fn read_timestamp(&mut self) -> Result<(i64, u32)>;
100
101 fn read_array_len(&mut self) -> Result<usize>;
103
104 fn read_map_len(&mut self) -> Result<usize>;
106
107 fn read_ext_len(&mut self) -> Result<(i8, usize)>;
109
110 fn read_string(&mut self) -> Result<alloc::borrow::Cow<'de, str>>;
113
114 fn read_string_bytes(&mut self) -> Result<alloc::borrow::Cow<'de, [u8]>>;
117
118 fn read_binary(&mut self) -> Result<alloc::borrow::Cow<'de, [u8]>>;
121
122 fn read_option<T: FromMessagePack<'de>>(&mut self) -> Result<Option<T>>;
125
126 fn read_array<T: FromMessagePack<'de>>(&mut self) -> Result<alloc::vec::Vec<T>>;
128
129 fn read_tag(&mut self) -> Result<Tag<'de>>;
131
132 #[inline(always)]
134 fn check_array_len(&mut self, expected: usize) -> Result<()> {
135 let actual = self.read_array_len()?;
136 if actual == expected {
137 Ok(())
138 } else {
139 Err(Error::ArrayLengthMismatch { expected, actual })
140 }
141 }
142
143 #[inline(always)]
145 fn check_map_len(&mut self, expected: usize) -> Result<()> {
146 let actual = self.read_map_len()?;
147 if actual == expected {
148 Ok(())
149 } else {
150 Err(Error::MapLengthMismatch { expected, actual })
151 }
152 }
153}
154
155pub struct SliceReader<'de> {
156 data: &'de [u8],
157 pos: usize,
158 depth: usize,
159}
160
161impl<'de> SliceReader<'de> {
162 pub fn new(data: &'de [u8]) -> Self {
163 Self {
164 data,
165 pos: 0,
166 depth: 0,
167 }
168 }
169
170 #[inline(always)]
171 fn peek_byte(&mut self) -> Result<u8> {
172 if self.pos < self.data.len() {
173 Ok(self.data[self.pos])
174 } else {
175 Err(Error::BufferTooSmall)
176 }
177 }
178
179 #[inline(always)]
180 fn peek_slice(&mut self, len: usize) -> Result<&'de [u8]> {
181 if self.pos + len <= self.data.len() {
182 unsafe { Ok(self.data.get_unchecked(self.pos..(self.pos + len))) }
183 } else {
184 Err(Error::BufferTooSmall)
185 }
186 }
187
188 #[inline(always)]
189 fn take_byte(&mut self) -> Result<u8> {
190 let byte = self.peek_byte()?;
191 self.pos += 1;
192 Ok(byte)
193 }
194
195 #[inline(always)]
196 fn take_slice(&mut self, len: usize) -> Result<&'de [u8]> {
197 let slice = self.peek_slice(len)?;
198 self.pos += len;
199 Ok(slice)
200 }
201
202 #[inline(always)]
203 fn take_array<const N: usize>(&mut self) -> Result<&'de [u8; N]> {
204 let slice = self.peek_slice(N)?;
205 self.pos += N;
206 Ok(unsafe { &*(slice.as_ptr() as *const [u8; N]) })
207 }
208}
209
210impl<'de> Read<'de> for SliceReader<'de> {
211 #[inline(always)]
212 fn increment_depth(&mut self) -> Result<()> {
213 if self.depth >= MAX_DEPTH {
214 Err(Error::DepthLimitExceeded { max: MAX_DEPTH })
215 } else {
216 self.depth += 1;
217 Ok(())
218 }
219 }
220
221 #[inline(always)]
222 fn decrement_depth(&mut self) {
223 if self.depth > 0 {
224 self.depth -= 1;
225 }
226 }
227
228 #[inline(always)]
229 fn read_nil(&mut self) -> Result<()> {
230 let byte = self.peek_byte()?;
231 if byte == NIL_MARKER {
232 self.pos += 1;
233 Ok(())
234 } else {
235 Err(Error::InvalidMarker(byte))
236 }
237 }
238
239 #[inline(always)]
240 fn read_boolean(&mut self) -> Result<bool> {
241 let byte = self.peek_byte()?;
242 match byte {
243 FALSE_MARKER => {
244 self.pos += 1;
245 Ok(false)
246 }
247 TRUE_MARKER => {
248 self.pos += 1;
249 Ok(true)
250 }
251 _ => Err(Error::InvalidMarker(byte)),
252 }
253 }
254
255 #[inline(always)]
256 fn read_u8(&mut self) -> Result<u8> {
257 let byte = self.peek_byte()?;
258 match byte {
259 POS_FIXINT_START..=POS_FIXINT_END => {
261 self.pos += 1;
262 Ok(byte)
263 }
264 UINT8_MARKER => {
266 self.pos += 1;
267 let byte = self.take_byte()?;
268 Ok(byte)
269 }
270 _ => Err(Error::InvalidMarker(byte)),
271 }
272 }
273
274 #[inline(always)]
275 fn read_u16(&mut self) -> Result<u16> {
276 let byte = self.peek_byte()?;
277 match byte {
278 POS_FIXINT_START..=POS_FIXINT_END => {
280 self.pos += 1;
281 Ok(byte as u16)
282 }
283 UINT8_MARKER => {
285 self.pos += 1;
286 let byte = self.take_byte()?;
287 Ok(byte as u16)
288 }
289 UINT16_MARKER => {
291 self.pos += 1;
292 let bytes = self.take_array::<2>()?;
293 Ok(u16::from_be_bytes(*bytes))
294 }
295 _ => Err(Error::InvalidMarker(byte)),
296 }
297 }
298
299 #[inline(always)]
300 fn read_u32(&mut self) -> Result<u32> {
301 let byte = self.peek_byte()?;
302 match byte {
303 POS_FIXINT_START..=POS_FIXINT_END => {
305 self.pos += 1;
306 Ok(byte as u32)
307 }
308 UINT8_MARKER => {
310 self.pos += 1;
311 let byte = self.take_byte()?;
312 Ok(byte as u32)
313 }
314 UINT16_MARKER => {
316 self.pos += 1;
317 let bytes = self.take_array::<2>()?;
318 Ok(u16::from_be_bytes(*bytes) as u32)
319 }
320 UINT32_MARKER => {
322 self.pos += 1;
323 let bytes = self.take_array::<4>()?;
324 Ok(u32::from_be_bytes(*bytes))
325 }
326 _ => Err(Error::InvalidMarker(byte)),
327 }
328 }
329
330 #[inline(always)]
331 fn read_u64(&mut self) -> Result<u64> {
332 let byte = self.peek_byte()?;
333 match byte {
334 POS_FIXINT_START..=POS_FIXINT_END => {
336 self.pos += 1;
337 Ok(byte as u64)
338 }
339 UINT8_MARKER => {
341 self.pos += 1;
342 let byte = self.take_byte()?;
343 Ok(byte as u64)
344 }
345 UINT16_MARKER => {
347 self.pos += 1;
348 let bytes = self.take_array::<2>()?;
349 Ok(u16::from_be_bytes(*bytes) as u64)
350 }
351 UINT32_MARKER => {
353 self.pos += 1;
354 let bytes = self.take_array::<4>()?;
355 Ok(u32::from_be_bytes(*bytes) as u64)
356 }
357 UINT64_MARKER => {
359 self.pos += 1;
360 let bytes = self.take_array::<8>()?;
361 Ok(u64::from_be_bytes(*bytes))
362 }
363 _ => Err(Error::InvalidMarker(byte)),
364 }
365 }
366
367 #[inline(always)]
368 fn read_i8(&mut self) -> Result<i8> {
369 let byte = self.peek_byte()?;
370 match byte {
371 POS_FIXINT_START..=POS_FIXINT_END => {
373 self.pos += 1;
374 Ok(byte as i8)
375 }
376 NEG_FIXINT_START..=NEG_FIXINT_END => {
378 self.pos += 1;
379 Ok(byte as i8)
380 }
381 INT8_MARKER => {
383 self.pos += 1;
384 let byte = self.take_byte()?;
385 Ok(byte as i8)
386 }
387 _ => Err(Error::InvalidMarker(byte)),
388 }
389 }
390
391 #[inline(always)]
392 fn read_i16(&mut self) -> Result<i16> {
393 let byte = self.peek_byte()?;
394 match byte {
395 POS_FIXINT_START..=POS_FIXINT_END => {
397 self.pos += 1;
398 Ok(byte as i16)
399 }
400 NEG_FIXINT_START..=NEG_FIXINT_END => {
402 self.pos += 1;
403 Ok((byte as i8) as i16)
404 }
405 INT8_MARKER => {
407 self.pos += 1;
408 let byte = self.take_byte()?;
409 Ok(byte as i8 as i16)
410 }
411 INT16_MARKER => {
413 self.pos += 1;
414 let bytes = self.take_array::<2>()?;
415 Ok(i16::from_be_bytes(*bytes))
416 }
417 _ => Err(Error::InvalidMarker(byte)),
418 }
419 }
420
421 #[inline(always)]
422 fn read_i32(&mut self) -> Result<i32> {
423 let byte = self.peek_byte()?;
424 match byte {
425 POS_FIXINT_START..=POS_FIXINT_END => {
427 self.pos += 1;
428 Ok(byte as i32)
429 }
430 NEG_FIXINT_START..=NEG_FIXINT_END => {
432 self.pos += 1;
433 Ok((byte as i8) as i32)
434 }
435 INT8_MARKER => {
437 self.pos += 1;
438 let byte = self.take_byte()?;
439 Ok(byte as i8 as i32)
440 }
441 INT16_MARKER => {
443 self.pos += 1;
444 let bytes = self.take_array::<2>()?;
445 Ok(i16::from_be_bytes(*bytes) as i32)
446 }
447 INT32_MARKER => {
449 self.pos += 1;
450 let bytes = self.take_array::<4>()?;
451 Ok(i32::from_be_bytes(*bytes))
452 }
453 _ => Err(Error::InvalidMarker(byte)),
454 }
455 }
456
457 #[inline(always)]
458 fn read_i64(&mut self) -> Result<i64> {
459 let byte = self.peek_byte()?;
460 match byte {
461 POS_FIXINT_START..=POS_FIXINT_END => {
463 self.pos += 1;
464 Ok(byte as i64)
465 }
466 NEG_FIXINT_START..=NEG_FIXINT_END => {
468 self.pos += 1;
469 Ok((byte as i8) as i64)
470 }
471 INT8_MARKER => {
473 self.pos += 1;
474 let byte = self.take_byte()?;
475 Ok(byte as i8 as i64)
476 }
477 INT16_MARKER => {
479 self.pos += 1;
480 let bytes = self.take_array::<2>()?;
481 Ok(i16::from_be_bytes(*bytes) as i64)
482 }
483 INT32_MARKER => {
485 self.pos += 1;
486 let bytes = self.take_array::<4>()?;
487 Ok(i32::from_be_bytes(*bytes) as i64)
488 }
489 INT64_MARKER => {
491 self.pos += 1;
492 let bytes = self.take_array::<8>()?;
493 Ok(i64::from_be_bytes(*bytes))
494 }
495 _ => Err(Error::InvalidMarker(byte)),
496 }
497 }
498
499 #[inline(always)]
500 fn read_f32(&mut self) -> Result<f32> {
501 let byte = self.peek_byte()?;
502 match byte {
503 0xca => {
505 self.pos += 1;
506 let bytes = self.take_array::<4>()?;
507 Ok(f32::from_bits(u32::from_be_bytes(*bytes)))
508 }
509 _ => Err(Error::InvalidMarker(byte)),
510 }
511 }
512
513 #[inline(always)]
514 fn read_f64(&mut self) -> Result<f64> {
515 let byte = self.peek_byte()?;
516 match byte {
517 0xcb => {
519 self.pos += 1;
520 let bytes = self.take_array::<8>()?;
521 Ok(f64::from_bits(u64::from_be_bytes(*bytes)))
522 }
523 _ => Err(Error::InvalidMarker(byte)),
524 }
525 }
526
527 #[inline(always)]
528 fn read_string(&mut self) -> Result<alloc::borrow::Cow<'de, str>> {
529 let byte = self.peek_byte()?;
530 let len = match byte {
531 FIXSTR_START..=FIXSTR_END => {
533 self.pos += 1;
534 (byte - FIXSTR_START) as usize
535 }
536 STR8_MARKER => {
538 self.pos += 1;
539 let byte = self.take_byte()?;
540 byte as usize
541 }
542 STR16_MARKER => {
544 self.pos += 1;
545 let bytes = self.take_array::<2>()?;
546 u16::from_be_bytes(*bytes) as usize
547 }
548 STR32_MARKER => {
550 self.pos += 1;
551 let bytes = self.take_array::<4>()?;
552 u32::from_be_bytes(*bytes) as usize
553 }
554 _ => return Err(Error::InvalidMarker(byte)),
555 };
556 let bytes = self.take_slice(len)?;
557 match core::str::from_utf8(bytes) {
558 Ok(s) => Ok(alloc::borrow::Cow::Borrowed(s)),
559 Err(err) => Err(Error::InvalidUtf8(err)),
560 }
561 }
562
563 #[inline(always)]
564 fn read_string_bytes(&mut self) -> Result<alloc::borrow::Cow<'de, [u8]>> {
565 let byte = self.peek_byte()?;
566 let len = match byte {
567 FIXSTR_START..=FIXSTR_END => {
569 self.pos += 1;
570 (byte - FIXSTR_START) as usize
571 }
572 STR8_MARKER => {
574 self.pos += 1;
575 let byte = self.take_byte()?;
576 byte as usize
577 }
578 STR16_MARKER => {
580 self.pos += 1;
581 let bytes = self.take_array::<2>()?;
582 u16::from_be_bytes(*bytes) as usize
583 }
584 STR32_MARKER => {
586 self.pos += 1;
587 let bytes = self.take_array::<4>()?;
588 u32::from_be_bytes(*bytes) as usize
589 }
590 _ => return Err(Error::InvalidMarker(byte)),
591 };
592 let bytes = self.take_slice(len)?;
593 Ok(alloc::borrow::Cow::Borrowed(bytes))
594 }
595
596 #[inline(always)]
597 fn read_binary(&mut self) -> Result<alloc::borrow::Cow<'de, [u8]>> {
598 let byte = self.peek_byte()?;
599 let len = match byte {
600 BIN8_MARKER => {
602 self.pos += 1;
603 let byte = self.take_byte()?;
604 byte as usize
605 }
606 BIN16_MARKER => {
608 self.pos += 1;
609 let bytes = self.take_array::<2>()?;
610 u16::from_be_bytes(*bytes) as usize
611 }
612 BIN32_MARKER => {
614 self.pos += 1;
615 let bytes = self.take_array::<4>()?;
616 u32::from_be_bytes(*bytes) as usize
617 }
618 _ => return Err(Error::InvalidMarker(byte)),
619 };
620 let bytes = self.take_slice(len)?;
621 Ok(alloc::borrow::Cow::Borrowed(bytes))
622 }
623
624 #[inline(always)]
625 fn read_timestamp(&mut self) -> Result<(i64, u32)> {
626 let byte = self.peek_byte()?;
627 match byte {
628 TIMESTAMP32_MARKER => {
630 self.pos += 1;
631 let ext_info = self.take_array::<5>()?;
632 let [ext, tail @ ..] = *ext_info;
633 if ext as i8 != TIMESTAMP_EXT_TYPE {
634 return Err(Error::InvalidMarker(ext));
635 }
636
637 let seconds = u32::from_be_bytes(tail) as i64;
638 Ok((seconds, 0))
639 }
640 TIMESTAMP64_MARKER => {
642 self.pos += 1;
643 let ext_info = self.take_array::<9>()?;
644 let [ext, tail @ ..] = *ext_info;
645 if ext as i8 != TIMESTAMP_EXT_TYPE {
646 return Err(Error::InvalidMarker(ext));
647 }
648
649 let data64 = u64::from_be_bytes(tail);
650 let nanoseconds = (data64 >> 34) as u32;
651 let seconds = (data64 & 0x0000_0003_ffff_ffff) as i64;
652 if nanoseconds >= 1_000_000_000 {
653 return Err(Error::InvalidTimestamp);
654 }
655 Ok((seconds, nanoseconds))
656 }
657 TIMESTAMP96_MARKER => {
659 self.pos += 1;
660 let len = self.take_byte()? as usize;
661 if len != 12 {
662 return Err(Error::InvalidMarker(len as u8));
663 }
664
665 let ext_info = self.take_array::<13>()?;
666 let [ext, tail @ ..] = *ext_info;
667 if ext as i8 != TIMESTAMP_EXT_TYPE {
668 return Err(Error::InvalidMarker(ext));
669 }
670
671 let nanoseconds = u32::from_be_bytes(tail[0..4].try_into().unwrap());
674 let seconds = i64::from_be_bytes(tail[4..12].try_into().unwrap());
675 if nanoseconds >= 1_000_000_000 {
676 return Err(Error::InvalidTimestamp);
677 }
678 Ok((seconds, nanoseconds))
679 }
680 _ => Err(Error::InvalidMarker(byte)),
681 }
682 }
683
684 #[inline(always)]
685 fn read_array_len(&mut self) -> Result<usize> {
686 let byte = self.peek_byte()?;
687 match byte {
688 FIXARRAY_START..=FIXARRAY_END => {
690 self.pos += 1;
691 Ok((byte - FIXARRAY_START) as usize)
692 }
693 ARRAY16_MARKER => {
695 self.pos += 1;
696 let bytes = self.take_array::<2>()?;
697 Ok(u16::from_be_bytes(*bytes) as usize)
698 }
699 ARRAY32_MARKER => {
701 self.pos += 1;
702 let bytes = self.take_array::<4>()?;
703 Ok(u32::from_be_bytes(*bytes) as usize)
704 }
705 _ => Err(Error::InvalidMarker(byte)),
706 }
707 }
708
709 #[inline(always)]
710 fn read_map_len(&mut self) -> Result<usize> {
711 let byte = self.peek_byte()?;
712 match byte {
713 FIXMAP_START..=FIXMAP_END => {
715 self.pos += 1;
716 Ok((byte - FIXMAP_START) as usize)
717 }
718 MAP16_MARKER => {
720 self.pos += 1;
721 let bytes = self.take_array::<2>()?;
722 Ok(u16::from_be_bytes(*bytes) as usize)
723 }
724 MAP32_MARKER => {
726 self.pos += 1;
727 let bytes = self.take_array::<4>()?;
728 Ok(u32::from_be_bytes(*bytes) as usize)
729 }
730 _ => Err(Error::InvalidMarker(byte)),
731 }
732 }
733
734 #[inline(always)]
735 fn read_ext_len(&mut self) -> Result<(i8, usize)> {
736 let byte = self.peek_byte()?;
737 let len = match byte {
738 FIXEXT1_MARKER => {
740 self.pos += 1;
741 1
742 }
743 FIXEXT2_MARKER => {
745 self.pos += 1;
746 2
747 }
748 FIXEXT4_MARKER => {
750 self.pos += 1;
751 4
752 }
753 FIXEXT8_MARKER => {
755 self.pos += 1;
756 8
757 }
758 FIXEXT16_MARKER => {
760 self.pos += 1;
761 16
762 }
763 EXT8_MARKER => {
765 self.pos += 1;
766 let byte = self.take_byte()?;
767 byte as usize
768 }
769 EXT16_MARKER => {
771 self.pos += 1;
772 let bytes = self.take_array::<2>()?;
773 u16::from_be_bytes(*bytes) as usize
774 }
775 EXT32_MARKER => {
777 self.pos += 1;
778 let bytes = self.take_array::<4>()?;
779 u32::from_be_bytes(*bytes) as usize
780 }
781 _ => return Err(Error::InvalidMarker(byte)),
782 };
783 let ext_type = self.take_byte()? as i8;
784 Ok((ext_type, len))
785 }
786
787 #[inline(always)]
788 fn read_array<T: FromMessagePack<'de>>(&mut self) -> Result<alloc::vec::Vec<T>>
789 where
790 Self: Sized,
791 {
792 let len = self.read_array_len()?;
793
794 if self.data.len() - self.pos < len {
799 return Err(Error::BufferTooSmall);
800 }
801
802 let mut vec = alloc::vec::Vec::with_capacity(len);
803 unsafe {
804 let mut ptr: *mut T = vec.as_mut_ptr();
805 for _ in 0..len {
806 let value = T::read(self)?;
807 ptr.write(value);
808 ptr = ptr.add(1);
809 }
810 vec.set_len(len);
811 }
812 Ok(vec)
813 }
814
815 #[inline(always)]
816 fn read_option<T: FromMessagePack<'de>>(&mut self) -> Result<Option<T>>
817 where
818 Self: Sized,
819 {
820 let byte = self.peek_byte()?;
821 if byte == NIL_MARKER {
822 self.pos += 1;
823 Ok(None)
824 } else {
825 Ok(Some(T::read(self)?))
826 }
827 }
828
829 #[inline(always)]
830 fn read_tag(&mut self) -> Result<Tag<'de>> {
831 let byte = self.peek_byte()?;
832 match byte {
833 POS_FIXINT_START..=POS_FIXINT_END => {
834 self.pos += 1;
835 Ok(Tag::Int(byte as u64))
836 }
837 UINT8_MARKER => {
838 self.pos += 1;
839 let byte = self.take_byte()?;
840 Ok(Tag::Int(byte as u64))
841 }
842 UINT16_MARKER => {
843 self.pos += 1;
844 let bytes = self.take_array::<2>()?;
845 Ok(Tag::Int(u16::from_be_bytes(*bytes) as u64))
846 }
847 UINT32_MARKER => {
848 self.pos += 1;
849 let bytes = self.take_array::<4>()?;
850 Ok(Tag::Int(u32::from_be_bytes(*bytes) as u64))
851 }
852 UINT64_MARKER => {
853 self.pos += 1;
854 let bytes = self.take_array::<8>()?;
855 Ok(Tag::Int(u64::from_be_bytes(*bytes)))
856 }
857 FIXSTR_START..=FIXSTR_END => {
858 self.pos += 1;
859 let len = (byte - FIXSTR_START) as usize;
860 let bytes = self.take_slice(len)?;
861 match core::str::from_utf8(bytes) {
862 Ok(s) => Ok(Tag::String(alloc::borrow::Cow::Borrowed(s))),
863 Err(err) => Err(Error::InvalidUtf8(err)),
864 }
865 }
866 STR8_MARKER => {
867 self.pos += 1;
868 let byte = self.take_byte()?;
869 let len = byte as usize;
870 let bytes = self.take_slice(len)?;
871 match core::str::from_utf8(bytes) {
872 Ok(s) => Ok(Tag::String(alloc::borrow::Cow::Borrowed(s))),
873 Err(err) => Err(Error::InvalidUtf8(err)),
874 }
875 }
876 STR16_MARKER => {
877 self.pos += 1;
878 let bytes = self.take_array::<2>()?;
879 let len = u16::from_be_bytes(*bytes) as usize;
880
881 let bytes = self.take_slice(len)?;
882 match core::str::from_utf8(bytes) {
883 Ok(s) => Ok(Tag::String(alloc::borrow::Cow::Borrowed(s))),
884 Err(err) => Err(Error::InvalidUtf8(err)),
885 }
886 }
887 STR32_MARKER => {
888 self.pos += 1;
889 let bytes = self.take_array::<4>()?;
890 let len = u32::from_be_bytes(*bytes) as usize;
891
892 let bytes = self.take_slice(len)?;
893 match core::str::from_utf8(bytes) {
894 Ok(s) => Ok(Tag::String(alloc::borrow::Cow::Borrowed(s))),
895 Err(err) => Err(Error::InvalidUtf8(err)),
896 }
897 }
898 _ => Err(Error::InvalidMarker(byte)),
899 }
900 }
901}
902
903#[cfg(feature = "std")]
904pub struct IOReader<R: std::io::Read> {
905 reader: R,
906 depth: usize,
907 peeked: Option<u8>,
908}
909
910#[cfg(feature = "std")]
911impl<R: std::io::Read> IOReader<R> {
912 pub fn new(reader: R) -> Self {
913 Self {
914 reader,
915 depth: 0,
916 peeked: None,
917 }
918 }
919
920 #[inline(always)]
921 fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
922 self.reader
923 .read_exact(buf)
924 .map_err(|err| Error::IoError(err))
925 }
926
927 #[inline(always)]
928 fn read_byte(&mut self) -> Result<u8> {
929 if let Some(byte) = self.peeked.take() {
930 Ok(byte)
931 } else {
932 let mut buf = [0u8; 1];
933 self.read_exact(&mut buf)?;
934 Ok(buf[0])
935 }
936 }
937
938 #[inline(always)]
939 fn unread_byte(&mut self, byte: u8) {
940 debug_assert!(self.peeked.is_none());
941 self.peeked = Some(byte);
942 }
943
944 #[inline(always)]
945 fn read_exact_vec(&mut self, len: usize) -> Result<alloc::vec::Vec<u8>> {
946 const CHUNK_SIZE: usize = 8192;
947
948 if len == 0 {
949 return Ok(alloc::vec::Vec::new());
950 } else if len < CHUNK_SIZE {
951 let mut buf = vec![0u8; len];
952 self.reader.read_exact(&mut buf).map_err(Error::IoError)?;
953 return Ok(buf);
954 }
955
956 let mut out = alloc::vec::Vec::new();
957 let mut remaining = len;
958 let mut chunk = [0u8; CHUNK_SIZE];
959
960 while remaining > 0 {
961 let to_read = core::cmp::min(remaining, chunk.len());
962 let n = self
963 .reader
964 .read(&mut chunk[..to_read])
965 .map_err(Error::IoError)?;
966 if n == 0 {
967 return Err(Error::BufferTooSmall);
968 }
969 out.extend_from_slice(&chunk[..n]);
970 remaining -= n;
971 }
972
973 Ok(out)
974 }
975}
976
977#[cfg(feature = "std")]
978impl<'de, R: std::io::Read> Read<'de> for IOReader<R> {
979 #[inline(always)]
980 fn increment_depth(&mut self) -> Result<()> {
981 if self.depth >= MAX_DEPTH {
982 Err(Error::DepthLimitExceeded { max: MAX_DEPTH })
983 } else {
984 self.depth += 1;
985 Ok(())
986 }
987 }
988
989 #[inline(always)]
990 fn decrement_depth(&mut self) {
991 self.depth -= 1;
992 }
993
994 #[inline(always)]
995 fn read_nil(&mut self) -> Result<()> {
996 let byte = self.read_byte()?;
997 if byte == NIL_MARKER {
998 Ok(())
999 } else {
1000 Err(Error::InvalidMarker(byte))
1001 }
1002 }
1003
1004 #[inline(always)]
1005 fn read_boolean(&mut self) -> Result<bool> {
1006 let byte = self.read_byte()?;
1007 match byte {
1008 FALSE_MARKER => Ok(false),
1009 TRUE_MARKER => Ok(true),
1010 _ => Err(Error::InvalidMarker(byte)),
1011 }
1012 }
1013
1014 #[inline(always)]
1015 fn read_u8(&mut self) -> Result<u8> {
1016 let byte = self.read_byte()?;
1017 match byte {
1018 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte),
1019 UINT8_MARKER => {
1020 let value = self.read_byte()?;
1021 Ok(value)
1022 }
1023 _ => Err(Error::InvalidMarker(byte)),
1024 }
1025 }
1026
1027 #[inline(always)]
1028 fn read_u16(&mut self) -> Result<u16> {
1029 let byte = self.read_byte()?;
1030 match byte {
1031 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte as u16),
1032 UINT8_MARKER => {
1033 let value = self.read_byte()?;
1034 Ok(value as u16)
1035 }
1036 UINT16_MARKER => {
1037 let mut buf = [0u8; 2];
1038 self.read_exact(&mut buf)?;
1039 Ok(u16::from_be_bytes(buf))
1040 }
1041 _ => Err(Error::InvalidMarker(byte)),
1042 }
1043 }
1044
1045 #[inline(always)]
1046 fn read_u32(&mut self) -> Result<u32> {
1047 let byte = self.read_byte()?;
1048 match byte {
1049 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte as u32),
1050 UINT8_MARKER => {
1051 let value = self.read_byte()?;
1052 Ok(value as u32)
1053 }
1054 UINT16_MARKER => {
1055 let mut buf = [0u8; 2];
1056 self.read_exact(&mut buf)?;
1057 Ok(u16::from_be_bytes(buf) as u32)
1058 }
1059 UINT32_MARKER => {
1060 let mut buf = [0u8; 4];
1061 self.read_exact(&mut buf)?;
1062 Ok(u32::from_be_bytes(buf))
1063 }
1064 _ => Err(Error::InvalidMarker(byte)),
1065 }
1066 }
1067
1068 #[inline(always)]
1069 fn read_u64(&mut self) -> Result<u64> {
1070 let byte = self.read_byte()?;
1071 match byte {
1072 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte as u64),
1073 UINT8_MARKER => {
1074 let value = self.read_byte()?;
1075 Ok(value as u64)
1076 }
1077 UINT16_MARKER => {
1078 let mut buf = [0u8; 2];
1079 self.read_exact(&mut buf)?;
1080 Ok(u16::from_be_bytes(buf) as u64)
1081 }
1082 UINT32_MARKER => {
1083 let mut buf = [0u8; 4];
1084 self.read_exact(&mut buf)?;
1085 Ok(u32::from_be_bytes(buf) as u64)
1086 }
1087 UINT64_MARKER => {
1088 let mut buf = [0u8; 8];
1089 self.read_exact(&mut buf)?;
1090 Ok(u64::from_be_bytes(buf))
1091 }
1092 _ => Err(Error::InvalidMarker(byte)),
1093 }
1094 }
1095
1096 #[inline(always)]
1097 fn read_i8(&mut self) -> Result<i8> {
1098 let byte = self.read_byte()?;
1099 match byte {
1100 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte as i8),
1101 NEG_FIXINT_START..=NEG_FIXINT_END => Ok(byte as i8),
1102 INT8_MARKER => {
1103 let value = self.read_byte()?;
1104 Ok(value as i8)
1105 }
1106 _ => Err(Error::InvalidMarker(byte)),
1107 }
1108 }
1109
1110 #[inline(always)]
1111 fn read_i16(&mut self) -> Result<i16> {
1112 let byte = self.read_byte()?;
1113 match byte {
1114 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte as i16),
1115 NEG_FIXINT_START..=NEG_FIXINT_END => Ok((byte as i8) as i16),
1116 INT8_MARKER => {
1117 let value = self.read_byte()?;
1118 Ok((value as i8) as i16)
1119 }
1120 INT16_MARKER => {
1121 let mut buf = [0u8; 2];
1122 self.read_exact(&mut buf)?;
1123 Ok(i16::from_be_bytes(buf))
1124 }
1125 _ => Err(Error::InvalidMarker(byte)),
1126 }
1127 }
1128
1129 #[inline(always)]
1130 fn read_i32(&mut self) -> Result<i32> {
1131 let byte = self.read_byte()?;
1132 match byte {
1133 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte as i32),
1134 NEG_FIXINT_START..=NEG_FIXINT_END => Ok((byte as i8) as i32),
1135 INT8_MARKER => {
1136 let value = self.read_byte()?;
1137 Ok((value as i8) as i32)
1138 }
1139 INT16_MARKER => {
1140 let mut buf = [0u8; 2];
1141 self.read_exact(&mut buf)?;
1142 Ok(i16::from_be_bytes(buf) as i32)
1143 }
1144 INT32_MARKER => {
1145 let mut buf = [0u8; 4];
1146 self.read_exact(&mut buf)?;
1147 Ok(i32::from_be_bytes(buf))
1148 }
1149 _ => Err(Error::InvalidMarker(byte)),
1150 }
1151 }
1152
1153 #[inline(always)]
1154 fn read_i64(&mut self) -> Result<i64> {
1155 let byte = self.read_byte()?;
1156 match byte {
1157 POS_FIXINT_START..=POS_FIXINT_END => Ok(byte as i64),
1158 NEG_FIXINT_START..=NEG_FIXINT_END => Ok((byte as i8) as i64),
1159 INT8_MARKER => {
1160 let value = self.read_byte()?;
1161 Ok((value as i8) as i64)
1162 }
1163 INT16_MARKER => {
1164 let mut buf = [0u8; 2];
1165 self.read_exact(&mut buf)?;
1166 Ok(i16::from_be_bytes(buf) as i64)
1167 }
1168 INT32_MARKER => {
1169 let mut buf = [0u8; 4];
1170 self.read_exact(&mut buf)?;
1171 Ok(i32::from_be_bytes(buf) as i64)
1172 }
1173 INT64_MARKER => {
1174 let mut buf = [0u8; 8];
1175 self.read_exact(&mut buf)?;
1176 Ok(i64::from_be_bytes(buf))
1177 }
1178 _ => Err(Error::InvalidMarker(byte)),
1179 }
1180 }
1181
1182 #[inline(always)]
1183 fn read_f32(&mut self) -> Result<f32> {
1184 let byte = self.read_byte()?;
1185 match byte {
1186 FLOAT32_MARKER => {
1187 let mut buf = [0u8; 4];
1188 self.read_exact(&mut buf)?;
1189 Ok(f32::from_bits(u32::from_be_bytes(buf)))
1190 }
1191 _ => Err(Error::InvalidMarker(byte)),
1192 }
1193 }
1194
1195 #[inline(always)]
1196 fn read_f64(&mut self) -> Result<f64> {
1197 let byte = self.read_byte()?;
1198 match byte {
1199 FLOAT64_MARKER => {
1200 let mut buf = [0u8; 8];
1201 self.read_exact(&mut buf)?;
1202 Ok(f64::from_bits(u64::from_be_bytes(buf)))
1203 }
1204 _ => Err(Error::InvalidMarker(byte)),
1205 }
1206 }
1207
1208 #[inline(always)]
1209 fn read_string(&mut self) -> Result<alloc::borrow::Cow<'de, str>> {
1210 let mut buf = [0u8; 1];
1211 let byte = self.read_byte()?;
1212 let len = match byte {
1213 FIXSTR_START..=FIXSTR_END => (byte - FIXSTR_START) as usize,
1214 STR8_MARKER => {
1215 self.read_exact(&mut buf)?;
1216 buf[0] as usize
1217 }
1218 STR16_MARKER => {
1219 let mut buf = [0u8; 2];
1220 self.read_exact(&mut buf)?;
1221 u16::from_be_bytes(buf) as usize
1222 }
1223 STR32_MARKER => {
1224 let mut buf = [0u8; 4];
1225 self.read_exact(&mut buf)?;
1226 u32::from_be_bytes(buf) as usize
1227 }
1228 _ => return Err(Error::InvalidMarker(byte)),
1229 };
1230
1231 let str_buf = self.read_exact_vec(len)?;
1232
1233 match alloc::string::String::from_utf8(str_buf) {
1234 Ok(s) => Ok(alloc::borrow::Cow::Owned(s)),
1235 Err(err) => Err(Error::InvalidUtf8(err.utf8_error())),
1236 }
1237 }
1238
1239 #[inline(always)]
1240 fn read_string_bytes(&mut self) -> Result<alloc::borrow::Cow<'de, [u8]>> {
1241 let mut buf = [0u8; 1];
1242 let byte = self.read_byte()?;
1243 let len = match byte {
1244 FIXSTR_START..=FIXSTR_END => (byte - FIXSTR_START) as usize,
1245 STR8_MARKER => {
1246 self.read_exact(&mut buf)?;
1247 buf[0] as usize
1248 }
1249 STR16_MARKER => {
1250 let mut buf = [0u8; 2];
1251 self.read_exact(&mut buf)?;
1252 u16::from_be_bytes(buf) as usize
1253 }
1254 STR32_MARKER => {
1255 let mut buf = [0u8; 4];
1256 self.read_exact(&mut buf)?;
1257 u32::from_be_bytes(buf) as usize
1258 }
1259 _ => return Err(Error::InvalidMarker(byte)),
1260 };
1261
1262 let str_buf = self.read_exact_vec(len)?;
1263 Ok(alloc::borrow::Cow::Owned(str_buf))
1264 }
1265
1266 #[inline(always)]
1267 fn read_binary(&mut self) -> Result<alloc::borrow::Cow<'de, [u8]>> {
1268 let mut buf = [0u8; 1];
1269 let byte = self.read_byte()?;
1270 let len = match byte {
1271 BIN8_MARKER => {
1272 self.read_exact(&mut buf)?;
1273 buf[0] as usize
1274 }
1275 BIN16_MARKER => {
1276 let mut buf = [0u8; 2];
1277 self.read_exact(&mut buf)?;
1278 u16::from_be_bytes(buf) as usize
1279 }
1280 BIN32_MARKER => {
1281 let mut buf = [0u8; 4];
1282 self.read_exact(&mut buf)?;
1283 u32::from_be_bytes(buf) as usize
1284 }
1285 _ => return Err(Error::InvalidMarker(byte)),
1286 };
1287
1288 let data_buf = self.read_exact_vec(len)?;
1289 Ok(alloc::borrow::Cow::Owned(data_buf))
1290 }
1291
1292 #[inline(always)]
1293 fn read_timestamp(&mut self) -> Result<(i64, u32)> {
1294 let byte = self.read_byte()?;
1295 match byte {
1296 TIMESTAMP32_MARKER => {
1297 let mut ext_info = [0u8; 5];
1298 self.read_exact(&mut ext_info)?;
1299
1300 let [ext, tail @ ..] = ext_info;
1301 if ext != TIMESTAMP_EXT_TYPE as u8 {
1302 return Err(Error::InvalidMarker(ext));
1303 }
1304 let seconds = u32::from_be_bytes(tail) as i64;
1305 Ok((seconds, 0))
1306 }
1307 TIMESTAMP64_MARKER => {
1308 let mut ext_info = [0u8; 9];
1309 self.read_exact(&mut ext_info)?;
1310
1311 let [ext, tail @ ..] = ext_info;
1312 if ext != -1i8 as u8 {
1313 return Err(Error::InvalidMarker(ext));
1314 }
1315
1316 let data64 = u64::from_be_bytes(tail);
1317 let nanoseconds = (data64 >> 34) as u32;
1318 let seconds = (data64 & 0x0000_0003_ffff_ffff) as i64;
1319 if nanoseconds >= 1_000_000_000 {
1320 return Err(Error::InvalidTimestamp);
1321 }
1322 Ok((seconds, nanoseconds))
1323 }
1324 TIMESTAMP96_MARKER => {
1325 let len = self.read_byte()? as usize;
1326 if len != 12 {
1327 return Err(Error::InvalidMarker(len as u8));
1328 }
1329
1330 let mut ext_info = [0u8; 13];
1331 self.read_exact(&mut ext_info)?;
1332 let [ext, tail @ ..] = ext_info;
1333 if ext != TIMESTAMP_EXT_TYPE as u8 {
1334 return Err(Error::InvalidMarker(ext));
1335 }
1336
1337 let nanoseconds = u32::from_be_bytes(tail[0..4].try_into().unwrap());
1340 let seconds = i64::from_be_bytes(tail[4..12].try_into().unwrap());
1341 if nanoseconds >= 1_000_000_000 {
1342 return Err(Error::InvalidTimestamp);
1343 }
1344
1345 Ok((seconds, nanoseconds))
1346 }
1347 _ => Err(Error::InvalidMarker(byte)),
1348 }
1349 }
1350
1351 #[inline(always)]
1352 fn read_array_len(&mut self) -> Result<usize> {
1353 let byte = self.read_byte()?;
1354 match byte {
1355 FIXARRAY_START..=FIXARRAY_END => Ok((byte - FIXARRAY_START) as usize),
1356 ARRAY16_MARKER => {
1357 let mut buf = [0u8; 2];
1358 self.read_exact(&mut buf)?;
1359 Ok(u16::from_be_bytes(buf) as usize)
1360 }
1361 ARRAY32_MARKER => {
1362 let mut buf = [0u8; 4];
1363 self.read_exact(&mut buf)?;
1364 Ok(u32::from_be_bytes(buf) as usize)
1365 }
1366 _ => Err(Error::InvalidMarker(byte)),
1367 }
1368 }
1369
1370 #[inline(always)]
1371 fn read_map_len(&mut self) -> Result<usize> {
1372 let byte = self.read_byte()?;
1373 match byte {
1374 FIXMAP_START..=FIXMAP_END => Ok((byte - FIXMAP_START) as usize),
1375 MAP16_MARKER => {
1376 let mut buf = [0u8; 2];
1377 self.read_exact(&mut buf)?;
1378 Ok(u16::from_be_bytes(buf) as usize)
1379 }
1380 MAP32_MARKER => {
1381 let mut buf = [0u8; 4];
1382 self.read_exact(&mut buf)?;
1383 Ok(u32::from_be_bytes(buf) as usize)
1384 }
1385 _ => Err(Error::InvalidMarker(byte)),
1386 }
1387 }
1388
1389 #[inline(always)]
1390 fn read_ext_len(&mut self) -> Result<(i8, usize)> {
1391 let mut buf = [0u8; 1];
1392 let byte = self.read_byte()?;
1393 let len = match byte {
1394 FIXEXT1_MARKER => 1,
1395 FIXEXT2_MARKER => 2,
1396 FIXEXT4_MARKER => 4,
1397 FIXEXT8_MARKER => 8,
1398 FIXEXT16_MARKER => 16,
1399 EXT8_MARKER => {
1400 self.read_exact(&mut buf)?;
1401 buf[0] as usize
1402 }
1403 EXT16_MARKER => {
1404 let mut buf = [0u8; 2];
1405 self.read_exact(&mut buf)?;
1406 u16::from_be_bytes(buf) as usize
1407 }
1408 EXT32_MARKER => {
1409 let mut buf = [0u8; 4];
1410 self.read_exact(&mut buf)?;
1411 u32::from_be_bytes(buf) as usize
1412 }
1413 _ => return Err(Error::InvalidMarker(byte)),
1414 };
1415 self.read_exact(&mut buf)?;
1416 let ext_type = buf[0] as i8;
1417 Ok((ext_type, len))
1418 }
1419
1420 #[inline(always)]
1421 fn read_option<T: FromMessagePack<'de>>(&mut self) -> Result<Option<T>> {
1422 let byte = self.read_byte()?;
1423 if byte == NIL_MARKER {
1424 Ok(None)
1425 } else {
1426 self.unread_byte(byte);
1427 Ok(Some(T::read(self)?))
1428 }
1429 }
1430
1431 #[inline(always)]
1432 fn read_array<T: FromMessagePack<'de>>(&mut self) -> Result<alloc::vec::Vec<T>> {
1433 let len = self.read_array_len()?;
1434 let mut vec = alloc::vec::Vec::new();
1435 for _ in 0..len {
1436 vec.push(T::read(self)?);
1437 }
1438 Ok(vec)
1439 }
1440
1441 fn read_tag(&mut self) -> Result<Tag<'de>> {
1442 let mut buf = [0u8; 1];
1443 let byte = self.read_byte()?;
1444 match byte {
1445 POS_FIXINT_START..=POS_FIXINT_END => Ok(Tag::Int(byte as u64)),
1446 UINT8_MARKER => {
1447 let value = self.read_byte()?;
1448 Ok(Tag::Int(value as u64))
1449 }
1450 UINT16_MARKER => {
1451 let mut buf = [0u8; 2];
1452 self.read_exact(&mut buf)?;
1453 Ok(Tag::Int(u16::from_be_bytes(buf) as u64))
1454 }
1455 UINT32_MARKER => {
1456 let mut buf = [0u8; 4];
1457 self.read_exact(&mut buf)?;
1458 Ok(Tag::Int(u32::from_be_bytes(buf) as u64))
1459 }
1460 UINT64_MARKER => {
1461 let mut buf = [0u8; 8];
1462 self.read_exact(&mut buf)?;
1463 Ok(Tag::Int(u64::from_be_bytes(buf)))
1464 }
1465 FIXSTR_START..=FIXSTR_END => {
1466 let len = (byte - FIXSTR_START) as usize;
1467 let str_buf = self.read_exact_vec(len)?;
1468 match alloc::string::String::from_utf8(str_buf) {
1469 Ok(s) => Ok(Tag::String(s.into())),
1470 Err(err) => Err(Error::InvalidUtf8(err.utf8_error())),
1471 }
1472 }
1473 STR8_MARKER => {
1474 self.read_exact(&mut buf)?;
1475 let len = buf[0] as usize;
1476 let str_buf = self.read_exact_vec(len)?;
1477 match alloc::string::String::from_utf8(str_buf) {
1478 Ok(s) => Ok(Tag::String(s.into())),
1479 Err(err) => Err(Error::InvalidUtf8(err.utf8_error())),
1480 }
1481 }
1482 STR16_MARKER => {
1483 let mut buf = [0u8; 2];
1484 self.read_exact(&mut buf)?;
1485 let len = u16::from_be_bytes(buf) as usize;
1486 let str_buf = self.read_exact_vec(len)?;
1487 match alloc::string::String::from_utf8(str_buf) {
1488 Ok(s) => Ok(Tag::String(s.into())),
1489 Err(err) => Err(Error::InvalidUtf8(err.utf8_error())),
1490 }
1491 }
1492 STR32_MARKER => {
1493 let mut buf = [0u8; 4];
1494 self.read_exact(&mut buf)?;
1495 let len = u32::from_be_bytes(buf) as usize;
1496 let str_buf = self.read_exact_vec(len)?;
1497 match alloc::string::String::from_utf8(str_buf) {
1498 Ok(s) => Ok(Tag::String(s.into())),
1499 Err(err) => Err(Error::InvalidUtf8(err.utf8_error())),
1500 }
1501 }
1502 _ => Err(Error::InvalidMarker(byte)),
1503 }
1504 }
1505}