1use crate::bytes::BytesEncoder;
5use crate::marker::Never;
6use crate::{ByteCount, Decode, Encode, EncodeExt, Eos, Error, ErrorKind, Result, SizedEncode};
7use std::cmp;
8use std::fmt;
9use std::iter;
10use std::marker::PhantomData;
11use std::mem;
12
13#[derive(Debug)]
17pub struct Map<D, T, F> {
18 inner: D,
19 map: F,
20 _item: PhantomData<T>,
21}
22impl<D: Decode, T, F> Map<D, T, F> {
23 pub fn inner_ref(&self) -> &D {
25 &self.inner
26 }
27
28 pub fn inner_mut(&mut self) -> &mut D {
30 &mut self.inner
31 }
32
33 pub fn into_inner(self) -> D {
35 self.inner
36 }
37
38 pub(crate) fn new(inner: D, map: F) -> Self
39 where
40 F: Fn(D::Item) -> T,
41 {
42 Map {
43 inner,
44 map,
45 _item: PhantomData,
46 }
47 }
48}
49impl<D, T, F> Decode for Map<D, T, F>
50where
51 D: Decode,
52 F: Fn(D::Item) -> T,
53{
54 type Item = T;
55
56 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
57 self.inner.decode(buf, eos)
58 }
59
60 fn finish_decoding(&mut self) -> Result<Self::Item> {
61 let item = self.inner.finish_decoding()?;
62 Ok((self.map)(item))
63 }
64
65 fn requiring_bytes(&self) -> ByteCount {
66 self.inner.requiring_bytes()
67 }
68
69 fn is_idle(&self) -> bool {
70 self.inner.is_idle()
71 }
72}
73
74#[derive(Debug)]
78pub struct MapErr<C, E, F> {
79 inner: C,
80 map_err: F,
81 _error: PhantomData<E>,
82}
83impl<C, E, F> MapErr<C, E, F> {
84 pub fn inner_ref(&self) -> &C {
86 &self.inner
87 }
88
89 pub fn inner_mut(&mut self) -> &mut C {
91 &mut self.inner
92 }
93
94 pub fn into_inner(self) -> C {
96 self.inner
97 }
98
99 pub(crate) fn new(inner: C, map_err: F) -> Self
100 where
101 F: Fn(Error) -> E,
102 Error: From<E>,
103 {
104 MapErr {
105 inner,
106 map_err,
107 _error: PhantomData,
108 }
109 }
110}
111impl<D, E, F> Decode for MapErr<D, E, F>
112where
113 D: Decode,
114 F: Fn(Error) -> E,
115 Error: From<E>,
116{
117 type Item = D::Item;
118
119 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
120 self.inner
121 .decode(buf, eos)
122 .map_err(|e| (self.map_err)(e).into())
123 }
124
125 fn finish_decoding(&mut self) -> Result<Self::Item> {
126 self.inner
127 .finish_decoding()
128 .map_err(|e| (self.map_err)(e).into())
129 }
130
131 fn requiring_bytes(&self) -> ByteCount {
132 self.inner.requiring_bytes()
133 }
134
135 fn is_idle(&self) -> bool {
136 self.inner.is_idle()
137 }
138}
139impl<C, E, F> Encode for MapErr<C, E, F>
140where
141 C: Encode,
142 F: Fn(Error) -> E,
143 Error: From<E>,
144{
145 type Item = C::Item;
146
147 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
148 self.inner
149 .encode(buf, eos)
150 .map_err(|e| (self.map_err)(e).into())
151 }
152
153 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
154 self.inner
155 .start_encoding(item)
156 .map_err(|e| (self.map_err)(e).into())
157 }
158
159 fn requiring_bytes(&self) -> ByteCount {
160 self.inner.requiring_bytes()
161 }
162
163 fn is_idle(&self) -> bool {
164 self.inner.is_idle()
165 }
166}
167impl<C, E, F> SizedEncode for MapErr<C, E, F>
168where
169 C: SizedEncode,
170 F: Fn(Error) -> E,
171 Error: From<E>,
172{
173 fn exact_requiring_bytes(&self) -> u64 {
174 self.inner.exact_requiring_bytes()
175 }
176}
177
178#[derive(Debug)]
185pub struct AndThen<D0, D1, F> {
186 inner0: D0,
187 inner1: Option<D1>,
188 and_then: F,
189}
190impl<D0: Decode, D1, F> AndThen<D0, D1, F> {
191 pub(crate) fn new(inner0: D0, and_then: F) -> Self
192 where
193 F: Fn(D0::Item) -> D1,
194 {
195 AndThen {
196 inner0,
197 inner1: None,
198 and_then,
199 }
200 }
201}
202impl<D0, D1, F> Decode for AndThen<D0, D1, F>
203where
204 D0: Decode,
205 D1: Decode,
206 F: Fn(D0::Item) -> D1,
207{
208 type Item = D1::Item;
209
210 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
211 let mut offset = 0;
212 if self.inner1.is_none() {
213 bytecodec_try_decode!(self.inner0, offset, buf, eos);
214 let item = track!(self.inner0.finish_decoding())?;
215 self.inner1 = Some((self.and_then)(item));
216 }
217
218 let inner1 = self.inner1.as_mut().expect("Never fails");
219 bytecodec_try_decode!(inner1, offset, buf, eos);
220 Ok(offset)
221 }
222
223 fn finish_decoding(&mut self) -> Result<Self::Item> {
224 let mut d = track_assert_some!(self.inner1.take(), ErrorKind::IncompleteDecoding);
225 track!(d.finish_decoding())
226 }
227
228 fn requiring_bytes(&self) -> ByteCount {
229 if let Some(ref d) = self.inner1 {
230 d.requiring_bytes()
231 } else {
232 self.inner0.requiring_bytes()
233 }
234 }
235
236 fn is_idle(&self) -> bool {
237 self.inner1.as_ref().is_some_and(Decode::is_idle)
238 }
239}
240
241#[derive(Debug)]
246pub struct MapFrom<E, T, F> {
247 inner: E,
248 _item: PhantomData<T>,
249 from: F,
250}
251impl<E, T, F> MapFrom<E, T, F> {
252 pub fn inner_ref(&self) -> &E {
254 &self.inner
255 }
256
257 pub fn inner_mut(&mut self) -> &mut E {
259 &mut self.inner
260 }
261
262 pub fn into_inner(self) -> E {
264 self.inner
265 }
266
267 pub(crate) fn new(inner: E, from: F) -> Self {
268 MapFrom {
269 inner,
270 _item: PhantomData,
271 from,
272 }
273 }
274}
275impl<E, T, F> Encode for MapFrom<E, T, F>
276where
277 E: Encode,
278 F: Fn(T) -> E::Item,
279{
280 type Item = T;
281
282 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
283 self.inner.encode(buf, eos)
284 }
285
286 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
287 self.inner.start_encoding((self.from)(item))
288 }
289
290 fn requiring_bytes(&self) -> ByteCount {
291 self.inner.requiring_bytes()
292 }
293
294 fn is_idle(&self) -> bool {
295 self.inner.is_idle()
296 }
297}
298impl<E, T, F> SizedEncode for MapFrom<E, T, F>
299where
300 E: SizedEncode,
301 F: Fn(T) -> E::Item,
302{
303 fn exact_requiring_bytes(&self) -> u64 {
304 self.inner.exact_requiring_bytes()
305 }
306}
307
308#[derive(Debug)]
313pub struct TryMapFrom<C, T, E, F> {
314 inner: C,
315 try_from: F,
316 _phantom: PhantomData<(T, E)>,
317}
318impl<C, T, E, F> TryMapFrom<C, T, E, F> {
319 pub fn inner_ref(&self) -> &C {
321 &self.inner
322 }
323
324 pub fn inner_mut(&mut self) -> &mut C {
326 &mut self.inner
327 }
328
329 pub fn into_inner(self) -> C {
331 self.inner
332 }
333
334 pub(crate) fn new(inner: C, try_from: F) -> Self {
335 TryMapFrom {
336 inner,
337 try_from,
338 _phantom: PhantomData,
339 }
340 }
341}
342impl<C, T, E, F> Encode for TryMapFrom<C, T, E, F>
343where
344 C: Encode,
345 F: Fn(T) -> std::result::Result<C::Item, E>,
346 Error: From<E>,
347{
348 type Item = T;
349
350 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
351 self.inner.encode(buf, eos)
352 }
353
354 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
355 let item = track!((self.try_from)(item).map_err(Error::from))?;
356 self.inner.start_encoding(item)
357 }
358
359 fn requiring_bytes(&self) -> ByteCount {
360 self.inner.requiring_bytes()
361 }
362
363 fn is_idle(&self) -> bool {
364 self.inner.is_idle()
365 }
366}
367impl<C, T, E, F> SizedEncode for TryMapFrom<C, T, E, F>
368where
369 C: SizedEncode,
370 F: Fn(T) -> std::result::Result<C::Item, E>,
371 Error: From<E>,
372{
373 fn exact_requiring_bytes(&self) -> u64 {
374 self.inner.exact_requiring_bytes()
375 }
376}
377
378#[derive(Debug)]
382pub struct Repeat<E, I> {
383 inner: E,
384 items: Option<I>,
385}
386impl<E, I> Repeat<E, I> {
387 pub fn inner_ref(&self) -> &E {
389 &self.inner
390 }
391
392 pub fn inner_mut(&mut self) -> &mut E {
394 &mut self.inner
395 }
396
397 pub fn into_inner(self) -> E {
399 self.inner
400 }
401
402 pub(crate) fn new(inner: E) -> Self {
403 Repeat { inner, items: None }
404 }
405}
406impl<E, I> Encode for Repeat<E, I>
407where
408 E: Encode,
409 I: Iterator<Item = E::Item>,
410{
411 type Item = I;
412
413 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
414 let mut offset = 0;
415 loop {
416 while self.inner.is_idle() {
417 if let Some(item) = self.items.as_mut().and_then(Iterator::next) {
418 track!(self.inner.start_encoding(item))?;
419 } else {
420 self.items = None;
421 return Ok(offset);
422 }
423 }
424
425 let size = track!(self.inner.encode(&mut buf[offset..], eos))?;
426 offset += size;
427 if size == 0 {
428 return Ok(offset);
429 }
430 }
431 }
432
433 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
434 track_assert!(self.is_idle(), ErrorKind::EncoderFull);
435 self.items = Some(item);
436 Ok(())
437 }
438
439 fn requiring_bytes(&self) -> ByteCount {
440 if self.is_idle() {
441 ByteCount::Finite(0)
442 } else {
443 ByteCount::Unknown
444 }
445 }
446
447 fn is_idle(&self) -> bool {
448 self.items.is_none()
449 }
450}
451impl<E: Default, I> Default for Repeat<E, I> {
452 fn default() -> Self {
453 Self::new(E::default())
454 }
455}
456
457#[derive(Debug, Default)]
461pub struct Omittable<D> {
462 inner: D,
463 do_omit: bool,
464}
465impl<D> Omittable<D> {
466 pub fn inner_ref(&self) -> &D {
468 &self.inner
469 }
470
471 pub fn inner_mut(&mut self) -> &mut D {
473 &mut self.inner
474 }
475
476 pub fn into_inner(self) -> D {
478 self.inner
479 }
480
481 pub fn do_omit(&mut self, b: bool) {
484 self.do_omit = b;
485 }
486
487 pub fn will_omit(&self) -> bool {
489 self.do_omit
490 }
491
492 pub(crate) fn new(inner: D, do_omit: bool) -> Self {
493 Omittable { inner, do_omit }
494 }
495}
496impl<D: Decode> Decode for Omittable<D> {
497 type Item = Option<D::Item>;
498
499 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
500 if self.do_omit {
501 Ok(0)
502 } else {
503 track!(self.inner.decode(buf, eos))
504 }
505 }
506
507 fn finish_decoding(&mut self) -> Result<Self::Item> {
508 if self.do_omit {
509 Ok(None)
510 } else {
511 track!(self.inner.finish_decoding()).map(Some)
512 }
513 }
514
515 fn requiring_bytes(&self) -> ByteCount {
516 if self.do_omit {
517 ByteCount::Finite(0)
518 } else {
519 self.inner.requiring_bytes()
520 }
521 }
522
523 fn is_idle(&self) -> bool {
524 self.do_omit || self.inner.is_idle()
525 }
526}
527
528#[derive(Debug, Default)]
530pub struct Optional<E>(E);
531impl<E> Optional<E> {
532 pub fn inner_ref(&self) -> &E {
534 &self.0
535 }
536
537 pub fn inner_mut(&mut self) -> &mut E {
539 &mut self.0
540 }
541
542 pub fn into_inner(self) -> E {
544 self.0
545 }
546
547 pub(crate) fn new(inner: E) -> Self {
548 Optional(inner)
549 }
550}
551impl<E: Encode> Encode for Optional<E> {
552 type Item = Option<E::Item>;
553
554 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
555 track!(self.0.encode(buf, eos))
556 }
557
558 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
559 if let Some(item) = item {
560 track!(self.0.start_encoding(item))?;
561 }
562 Ok(())
563 }
564
565 fn requiring_bytes(&self) -> ByteCount {
566 self.0.requiring_bytes()
567 }
568
569 fn is_idle(&self) -> bool {
570 self.0.is_idle()
571 }
572}
573impl<E: SizedEncode> SizedEncode for Optional<E> {
574 fn exact_requiring_bytes(&self) -> u64 {
575 self.0.exact_requiring_bytes()
576 }
577}
578
579#[derive(Debug, Default)]
586pub struct Collect<D, T> {
587 inner: D,
588 items: T,
589 eos: bool,
590}
591impl<D, T: Default> Collect<D, T> {
592 pub fn inner_ref(&self) -> &D {
594 &self.inner
595 }
596
597 pub fn inner_mut(&mut self) -> &mut D {
599 &mut self.inner
600 }
601
602 pub fn into_inner(self) -> D {
604 self.inner
605 }
606
607 pub(crate) fn new(inner: D) -> Self {
608 Collect {
609 inner,
610 items: T::default(),
611 eos: false,
612 }
613 }
614}
615impl<D, T: Default> Decode for Collect<D, T>
616where
617 D: Decode,
618 T: Extend<D::Item>,
619{
620 type Item = T;
621
622 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
623 if self.eos {
624 return Ok(0);
625 }
626
627 let mut offset = 0;
628 while offset < buf.len() {
629 bytecodec_try_decode!(self.inner, offset, buf, eos);
630
631 let item = track!(self.inner.finish_decoding())?;
632 self.items.extend(iter::once(item));
633 }
634 if eos.is_reached() {
635 self.eos = true;
636 }
637 Ok(offset)
638 }
639
640 fn finish_decoding(&mut self) -> Result<Self::Item> {
641 track_assert!(self.eos, ErrorKind::IncompleteDecoding);
642 self.eos = false;
643 let items = mem::take(&mut self.items);
644 Ok(items)
645 }
646
647 fn requiring_bytes(&self) -> ByteCount {
648 if self.eos {
649 ByteCount::Finite(0)
650 } else {
651 self.inner.requiring_bytes()
652 }
653 }
654
655 fn is_idle(&self) -> bool {
656 self.eos
657 }
658}
659
660#[derive(Debug, Default)]
664pub struct Length<C> {
665 inner: C,
666 expected_bytes: u64,
667 remaining_bytes: u64,
668}
669impl<C> Length<C> {
670 pub(crate) fn new(inner: C, expected_bytes: u64) -> Self {
671 Length {
672 inner,
673 expected_bytes,
674 remaining_bytes: expected_bytes,
675 }
676 }
677
678 pub fn expected_bytes(&self) -> u64 {
680 self.expected_bytes
681 }
682
683 pub fn set_expected_bytes(&mut self, bytes: u64) -> Result<()> {
689 track_assert_eq!(
690 self.remaining_bytes,
691 self.expected_bytes,
692 ErrorKind::IncompleteDecoding,
693 "An item is being decoded"
694 );
695 self.expected_bytes = bytes;
696 self.remaining_bytes = bytes;
697 Ok(())
698 }
699
700 pub fn remaining_bytes(&self) -> u64 {
702 self.remaining_bytes
703 }
704
705 pub fn inner_ref(&self) -> &C {
707 &self.inner
708 }
709
710 pub fn inner_mut(&mut self) -> &mut C {
712 &mut self.inner
713 }
714
715 pub fn into_inner(self) -> C {
717 self.inner
718 }
719}
720impl<D: Decode> Decode for Length<D> {
721 type Item = D::Item;
722
723 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
724 let limit = cmp::min(buf.len() as u64, self.remaining_bytes) as usize;
725 let required = self.remaining_bytes - limit as u64;
726 let expected_eos = Eos::with_remaining_bytes(ByteCount::Finite(required));
727 if let Some(mut remaining) = eos.remaining_bytes().to_u64() {
728 remaining += buf.len() as u64;
729 track_assert!(remaining >= required, ErrorKind::UnexpectedEos; remaining, required);
730 }
731
732 let size = track!(self.inner.decode(&buf[..limit], expected_eos))?;
733 self.remaining_bytes -= size as u64;
734 Ok(size)
735 }
736
737 fn finish_decoding(&mut self) -> Result<Self::Item> {
738 track_assert_eq!(self.remaining_bytes, 0, ErrorKind::IncompleteDecoding);
739 self.remaining_bytes = self.expected_bytes;
740
741 track!(self.inner.finish_decoding())
742 }
743
744 fn requiring_bytes(&self) -> ByteCount {
745 ByteCount::Finite(self.remaining_bytes)
746 }
747
748 fn is_idle(&self) -> bool {
749 self.inner.is_idle()
750 }
751}
752impl<E: Encode> Encode for Length<E> {
753 type Item = E::Item;
754
755 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
756 if (buf.len() as u64) < self.remaining_bytes {
757 track_assert!(!eos.is_reached(), ErrorKind::UnexpectedEos);
758 }
759
760 let (limit, eos) = if (buf.len() as u64) < self.remaining_bytes {
761 (buf.len(), eos)
762 } else {
763 (self.remaining_bytes as usize, Eos::new(true))
764 };
765 let size = track!(self.inner.encode(&mut buf[..limit], eos))?;
766 self.remaining_bytes -= size as u64;
767 if self.inner.is_idle() {
768 track_assert_eq!(
769 self.remaining_bytes,
770 0,
771 ErrorKind::InvalidInput,
772 "Too small item"
773 );
774 }
775 Ok(size)
776 }
777
778 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
779 track_assert_eq!(
780 self.remaining_bytes,
781 self.expected_bytes,
782 ErrorKind::EncoderFull
783 );
784 self.remaining_bytes = self.expected_bytes;
785 track!(self.inner.start_encoding(item))
786 }
787
788 fn requiring_bytes(&self) -> ByteCount {
789 ByteCount::Finite(self.remaining_bytes)
790 }
791
792 fn is_idle(&self) -> bool {
793 self.remaining_bytes == 0
794 }
795}
796impl<E: Encode> SizedEncode for Length<E> {
797 fn exact_requiring_bytes(&self) -> u64 {
798 self.remaining_bytes
799 }
800}
801
802#[derive(Debug, Default)]
806pub struct CollectN<D, T> {
807 inner: D,
808 remaining_items: usize,
809 items: T,
810}
811impl<D, T: Default> CollectN<D, T> {
812 pub fn remaining_items(&self) -> usize {
814 self.remaining_items
815 }
816
817 pub fn set_remaining_items(&mut self, n: usize) {
819 self.remaining_items = n;
820 }
821
822 pub fn inner_ref(&self) -> &D {
824 &self.inner
825 }
826
827 pub fn inner_mut(&mut self) -> &mut D {
829 &mut self.inner
830 }
831
832 pub fn into_inner(self) -> D {
834 self.inner
835 }
836
837 pub(crate) fn new(inner: D, count: usize) -> Self {
838 CollectN {
839 inner,
840 remaining_items: count,
841 items: T::default(),
842 }
843 }
844}
845impl<D, T> Decode for CollectN<D, T>
846where
847 D: Decode,
848 T: Default + Extend<D::Item>,
849{
850 type Item = T;
851
852 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
853 let mut offset = 0;
854 while self.remaining_items != 0 && offset < buf.len() {
855 bytecodec_try_decode!(self.inner, offset, buf, eos);
856
857 let item = track!(self.inner.finish_decoding())?;
858 self.items.extend(iter::once(item));
859 self.remaining_items -= 1;
860 }
861 if self.remaining_items != 0 {
862 track_assert!(!eos.is_reached(), ErrorKind::UnexpectedEos);
863 }
864 Ok(offset)
865 }
866
867 fn finish_decoding(&mut self) -> Result<Self::Item> {
868 track_assert_eq!(self.remaining_items, 0, ErrorKind::IncompleteDecoding);
869 let items = mem::take(&mut self.items);
870 Ok(items)
871 }
872
873 fn requiring_bytes(&self) -> ByteCount {
874 if self.remaining_items == 0 {
875 ByteCount::Finite(0)
876 } else {
877 self.inner.requiring_bytes()
878 }
879 }
880
881 fn is_idle(&self) -> bool {
882 self.remaining_items == 0
883 }
884}
885
886#[derive(Debug)]
890pub struct TryMap<D, T, E, F> {
891 inner: D,
892 try_map: F,
893 _phantom: PhantomData<(T, E)>,
894}
895impl<D, T, E, F> TryMap<D, T, E, F> {
896 pub fn inner_ref(&self) -> &D {
898 &self.inner
899 }
900
901 pub fn inner_mut(&mut self) -> &mut D {
903 &mut self.inner
904 }
905
906 pub fn into_inner(self) -> D {
908 self.inner
909 }
910
911 pub(crate) fn new(inner: D, try_map: F) -> Self {
912 TryMap {
913 inner,
914 try_map,
915 _phantom: PhantomData,
916 }
917 }
918}
919impl<D, T, E, F> Decode for TryMap<D, T, E, F>
920where
921 D: Decode,
922 F: Fn(D::Item) -> std::result::Result<T, E>,
923 Error: From<E>,
924{
925 type Item = T;
926
927 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
928 track!(self.inner.decode(buf, eos))
929 }
930
931 fn finish_decoding(&mut self) -> Result<Self::Item> {
932 let item = track!(self.inner.finish_decoding())?;
933 track!((self.try_map)(item).map_err(Error::from))
934 }
935
936 fn requiring_bytes(&self) -> ByteCount {
937 self.inner.requiring_bytes()
938 }
939
940 fn is_idle(&self) -> bool {
941 self.inner.is_idle()
942 }
943}
944
945#[derive(Debug, Default)]
951pub struct MaxBytes<C> {
952 inner: C,
953 consumed_bytes: u64,
954 max_bytes: u64,
955}
956impl<C> MaxBytes<C> {
957 pub(crate) fn new(inner: C, max_bytes: u64) -> Self {
958 MaxBytes {
959 inner,
960 consumed_bytes: 0,
961 max_bytes,
962 }
963 }
964
965 pub fn consumed_bytes(&self) -> u64 {
967 self.consumed_bytes
968 }
969
970 pub fn max_bytes(&self) -> u64 {
972 self.max_bytes
973 }
974
975 pub fn set_max_bytes(&mut self, n: u64) -> Result<()> {
981 track_assert!(
982 self.consumed_bytes <= n,
983 ErrorKind::InvalidInput;
984 self.consumed_bytes,
985 n
986 );
987 self.max_bytes = n;
988 Ok(())
989 }
990
991 pub fn inner_ref(&self) -> &C {
993 &self.inner
994 }
995
996 pub fn inner_mut(&mut self) -> &mut C {
998 &mut self.inner
999 }
1000
1001 pub fn into_inner(self) -> C {
1003 self.inner
1004 }
1005}
1006impl<D: Decode> Decode for MaxBytes<D> {
1007 type Item = D::Item;
1008
1009 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
1010 match eos.remaining_bytes() {
1011 ByteCount::Infinite => {
1012 track_panic!(ErrorKind::InvalidInput, "Max bytes limit exceeded";
1013 self.consumed_bytes, self.max_bytes)
1014 }
1015 ByteCount::Unknown => {
1016 let consumable_bytes = self.max_bytes - self.consumed_bytes;
1017 track_assert!((buf.len() as u64) <= consumable_bytes,
1018 ErrorKind::InvalidInput, "Max bytes limit exceeded";
1019 buf.len(), self.consumed_bytes, self.max_bytes);
1020 }
1021 ByteCount::Finite(remaining_bytes) => {
1022 let consumable_bytes = self.max_bytes - self.consumed_bytes;
1023 track_assert!((buf.len() as u64) + remaining_bytes <= consumable_bytes,
1024 ErrorKind::InvalidInput, "Max bytes limit exceeded";
1025 buf.len(), remaining_bytes, self.consumed_bytes, self.max_bytes)
1026 }
1027 }
1028
1029 let size = track!(self.inner.decode(buf, eos))?;
1030 self.consumed_bytes += size as u64;
1031 Ok(size)
1032 }
1033
1034 fn finish_decoding(&mut self) -> Result<Self::Item> {
1035 self.consumed_bytes = 0;
1036 track!(self.inner.finish_decoding())
1037 }
1038
1039 fn requiring_bytes(&self) -> ByteCount {
1040 self.inner.requiring_bytes()
1041 }
1042
1043 fn is_idle(&self) -> bool {
1044 self.inner.is_idle()
1045 }
1046}
1047impl<E: Encode> Encode for MaxBytes<E> {
1048 type Item = E::Item;
1049
1050 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
1051 let size = track!(self.inner.encode(buf, eos))?;
1052 self.consumed_bytes += size as u64;
1053 track_assert!(self.consumed_bytes <= self.max_bytes,
1054 ErrorKind::InvalidInput, "Max bytes limit exceeded";
1055 self.consumed_bytes, self.max_bytes);
1056 if self.is_idle() {
1057 self.consumed_bytes = 0;
1058 }
1059 Ok(size)
1060 }
1061
1062 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
1063 track!(self.inner.start_encoding(item))
1064 }
1065
1066 fn requiring_bytes(&self) -> ByteCount {
1067 self.inner.requiring_bytes()
1068 }
1069
1070 fn is_idle(&self) -> bool {
1071 self.inner.is_idle()
1072 }
1073}
1074impl<E: SizedEncode> SizedEncode for MaxBytes<E> {
1075 fn exact_requiring_bytes(&self) -> u64 {
1076 self.inner.exact_requiring_bytes()
1077 }
1078}
1079
1080#[derive(Debug, Default)]
1084pub struct PreEncode<E> {
1085 inner: E,
1086 pre_encoded: BytesEncoder<Vec<u8>>,
1087}
1088impl<E> PreEncode<E> {
1089 pub fn inner_ref(&self) -> &E {
1091 &self.inner
1092 }
1093
1094 pub fn inner_mut(&mut self) -> &mut E {
1096 &mut self.inner
1097 }
1098
1099 pub fn into_inner(self) -> E {
1101 self.inner
1102 }
1103
1104 pub(crate) fn new(inner: E) -> Self {
1105 PreEncode {
1106 inner,
1107 pre_encoded: BytesEncoder::new(),
1108 }
1109 }
1110}
1111impl<E: Encode> Encode for PreEncode<E> {
1112 type Item = E::Item;
1113
1114 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
1115 track!(self.pre_encoded.encode(buf, eos))
1116 }
1117
1118 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
1119 let buf = track!(self.inner.encode_into_bytes(item))?;
1120 track!(self.pre_encoded.start_encoding(buf))?;
1121 Ok(())
1122 }
1123
1124 fn requiring_bytes(&self) -> ByteCount {
1125 self.pre_encoded.requiring_bytes()
1126 }
1127
1128 fn is_idle(&self) -> bool {
1129 self.pre_encoded.is_idle()
1130 }
1131}
1132impl<E: Encode> SizedEncode for PreEncode<E> {
1133 fn exact_requiring_bytes(&self) -> u64 {
1134 self.pre_encoded.exact_requiring_bytes()
1135 }
1136}
1137
1138#[derive(Debug, Default)]
1142pub struct Slice<T> {
1143 inner: T,
1144 consumable_bytes: u64,
1145}
1146impl<T> Slice<T> {
1147 pub(crate) fn new(inner: T) -> Self {
1148 Slice {
1149 inner,
1150 consumable_bytes: 0,
1151 }
1152 }
1153
1154 pub fn consumable_bytes(&self) -> u64 {
1158 self.consumable_bytes
1159 }
1160
1161 pub fn set_consumable_bytes(&mut self, n: u64) {
1163 self.consumable_bytes = n;
1164 }
1165
1166 pub fn is_suspended(&self) -> bool {
1171 self.consumable_bytes == 0
1172 }
1173
1174 pub fn inner_ref(&self) -> &T {
1176 &self.inner
1177 }
1178
1179 pub fn inner_mut(&mut self) -> &mut T {
1181 &mut self.inner
1182 }
1183
1184 pub fn into_inner(self) -> T {
1186 self.inner
1187 }
1188}
1189impl<D: Decode> Decode for Slice<D> {
1190 type Item = D::Item;
1191
1192 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
1193 let limit = cmp::min(buf.len() as u64, self.consumable_bytes) as usize;
1194 let eos = eos.back((buf.len() - limit) as u64);
1195 let size = track!(self.inner.decode(&buf[..limit], eos))?;
1196 self.consumable_bytes -= size as u64;
1197 Ok(size)
1198 }
1199
1200 fn finish_decoding(&mut self) -> Result<Self::Item> {
1201 track!(self.inner.finish_decoding())
1202 }
1203
1204 fn requiring_bytes(&self) -> ByteCount {
1205 self.inner.requiring_bytes()
1206 }
1207
1208 fn is_idle(&self) -> bool {
1209 self.inner.is_idle()
1210 }
1211}
1212impl<E: Encode> Encode for Slice<E> {
1213 type Item = E::Item;
1214
1215 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
1216 let limit = cmp::min(buf.len() as u64, self.consumable_bytes) as usize;
1217 let eos = eos.back((buf.len() - limit) as u64);
1218 let size = track!(self.inner.encode(&mut buf[..limit], eos))?;
1219 self.consumable_bytes -= size as u64;
1220 Ok(size)
1221 }
1222
1223 fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
1224 track!(self.inner.start_encoding(item))
1225 }
1226
1227 fn is_idle(&self) -> bool {
1228 self.inner.is_idle()
1229 }
1230
1231 fn requiring_bytes(&self) -> ByteCount {
1232 self.inner.requiring_bytes()
1233 }
1234}
1235impl<E: SizedEncode> SizedEncode for Slice<E> {
1236 fn exact_requiring_bytes(&self) -> u64 {
1237 self.inner.exact_requiring_bytes()
1238 }
1239}
1240
1241#[derive(Debug, Default)]
1245pub struct Last<E: Encode> {
1246 inner: E,
1247 item: Option<E::Item>,
1248}
1249impl<E: Encode> Last<E> {
1250 pub fn inner_ref(&self) -> &E {
1252 &self.inner
1253 }
1254
1255 pub fn inner_mut(&mut self) -> &mut E {
1257 &mut self.inner
1258 }
1259
1260 pub fn into_inner(self) -> E {
1262 self.inner
1263 }
1264
1265 pub(crate) fn new(inner: E, item: E::Item) -> Self {
1266 Last {
1267 inner,
1268 item: Some(item),
1269 }
1270 }
1271}
1272impl<E: Encode> Encode for Last<E> {
1273 type Item = Never;
1274
1275 fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
1276 if self.inner.is_idle() {
1277 if let Some(item) = self.item.take() {
1278 track!(self.inner.start_encoding(item))?;
1279 }
1280 }
1281 track!(self.inner.encode(buf, eos))
1282 }
1283
1284 fn start_encoding(&mut self, _item: Self::Item) -> Result<()> {
1285 unreachable!()
1286 }
1287
1288 fn is_idle(&self) -> bool {
1289 self.item.is_none() && self.inner.is_idle()
1290 }
1291
1292 fn requiring_bytes(&self) -> ByteCount {
1293 if self.item.is_some() {
1294 ByteCount::Unknown
1295 } else {
1296 self.inner.requiring_bytes()
1297 }
1298 }
1299}
1300impl<E: SizedEncode> SizedEncode for Last<E> {
1301 fn exact_requiring_bytes(&self) -> u64 {
1302 self.inner.exact_requiring_bytes()
1303 }
1304}
1305
1306pub struct Peekable<D: Decode> {
1310 inner: D,
1311 item: Option<D::Item>,
1312}
1313impl<D: Decode> Peekable<D> {
1314 pub fn peek(&self) -> Option<&D::Item> {
1316 self.item.as_ref()
1317 }
1318
1319 pub fn peek_mut(&mut self) -> Option<&mut D::Item> {
1321 self.item.as_mut()
1322 }
1323
1324 pub fn inner_ref(&self) -> &D {
1326 &self.inner
1327 }
1328
1329 pub fn inner_mut(&mut self) -> &mut D {
1331 &mut self.inner
1332 }
1333
1334 pub fn into_inner(self) -> D {
1336 self.inner
1337 }
1338
1339 pub(crate) fn new(inner: D) -> Self {
1340 Peekable { inner, item: None }
1341 }
1342}
1343impl<D: Decode + fmt::Debug> fmt::Debug for Peekable<D> {
1344 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1345 write!(
1346 f,
1347 "Peekable {{ inner: {:?}, item.is_some(): {:?} }}",
1348 self.inner,
1349 self.item.is_some()
1350 )
1351 }
1352}
1353impl<D: Decode + Default> Default for Peekable<D> {
1354 fn default() -> Self {
1355 Peekable {
1356 inner: D::default(),
1357 item: None,
1358 }
1359 }
1360}
1361impl<D: Decode> Decode for Peekable<D> {
1362 type Item = D::Item;
1363
1364 fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
1365 if self.item.is_none() {
1366 let size = track!(self.inner.decode(buf, eos))?;
1367 if self.inner.is_idle() {
1368 self.item = Some(track!(self.inner.finish_decoding())?);
1369 }
1370 Ok(size)
1371 } else {
1372 Ok(0)
1373 }
1374 }
1375
1376 fn finish_decoding(&mut self) -> Result<Self::Item> {
1377 let item = track_assert_some!(self.item.take(), ErrorKind::IncompleteDecoding);
1378 Ok(item)
1379 }
1380
1381 fn requiring_bytes(&self) -> ByteCount {
1382 if self.item.is_some() {
1383 ByteCount::Finite(0)
1384 } else {
1385 self.inner.requiring_bytes()
1386 }
1387 }
1388
1389 fn is_idle(&self) -> bool {
1390 self.item.is_some()
1391 }
1392}
1393
1394#[derive(Debug, Default)]
1398pub struct MaybeEos<D> {
1399 inner: D,
1400 started: bool,
1401}
1402impl<D> MaybeEos<D> {
1403 pub fn inner_ref(&self) -> &D {
1405 &self.inner
1406 }
1407
1408 pub fn inner_mut(&mut self) -> &mut D {
1410 &mut self.inner
1411 }
1412
1413 pub fn into_inner(self) -> D {
1415 self.inner
1416 }
1417
1418 pub(crate) fn new(inner: D) -> Self {
1419 MaybeEos {
1420 inner,
1421 started: false,
1422 }
1423 }
1424}
1425impl<D: Decode> Decode for MaybeEos<D> {
1426 type Item = D::Item;
1427
1428 fn decode(&mut self, buf: &[u8], mut eos: Eos) -> Result<usize> {
1429 if !self.started && buf.is_empty() && eos.is_reached() {
1430 eos = Eos::new(false);
1431 }
1432
1433 let size = track!(self.inner.decode(buf, eos))?;
1434 if size != 0 {
1435 self.started = true;
1436 }
1437 Ok(size)
1438 }
1439
1440 fn finish_decoding(&mut self) -> Result<Self::Item> {
1441 self.started = false;
1442 track!(self.inner.finish_decoding())
1443 }
1444
1445 fn requiring_bytes(&self) -> ByteCount {
1446 self.inner.requiring_bytes()
1447 }
1448
1449 fn is_idle(&self) -> bool {
1450 self.inner.is_idle()
1451 }
1452}
1453
1454#[cfg(test)]
1455mod test {
1456 use crate::bytes::{Utf8Decoder, Utf8Encoder};
1457 use crate::fixnum::{U16beDecoder, U8Decoder, U8Encoder};
1458 use crate::io::{IoDecodeExt, IoEncodeExt};
1459 use crate::tuple::TupleDecoder;
1460 use crate::{Decode, DecodeExt, Encode, EncodeExt, Eos, ErrorKind};
1461
1462 #[test]
1463 fn collect_works() {
1464 let mut decoder = U8Decoder::new().collect::<Vec<_>>();
1465 let item = track_try_unwrap!(decoder.decode_exact(b"foo".as_ref()));
1466 assert_eq!(item, vec![b'f', b'o', b'o']);
1467 }
1468
1469 #[test]
1470 fn collectn_works() {
1471 let mut decoder = U8Decoder::new().collectn::<Vec<_>>(2);
1472 let item = track_try_unwrap!(decoder.decode_exact(b"foo".as_ref()));
1473 assert_eq!(item, vec![b'f', b'o']);
1474
1475 let mut decoder = U8Decoder::new().collectn::<Vec<_>>(4);
1476 assert_eq!(
1477 decoder
1478 .decode_exact(b"foo".as_ref())
1479 .err()
1480 .map(|e| *e.kind()),
1481 Some(ErrorKind::UnexpectedEos)
1482 );
1483 }
1484
1485 #[test]
1486 fn decoder_length_works() {
1487 let mut decoder = Utf8Decoder::new().length(3);
1489 let mut input = b"foobarba".as_ref();
1490
1491 let item = track_try_unwrap!(decoder.decode_exact(&mut input));
1492 assert_eq!(item, "foo");
1493
1494 let item = track_try_unwrap!(decoder.decode_exact(&mut input));
1495 assert_eq!(item, "bar");
1496
1497 let error = decoder.decode_exact(&mut input).err().unwrap();
1498 assert_eq!(*error.kind(), ErrorKind::UnexpectedEos);
1499
1500 let mut decoder = Utf8Decoder::new().length(0);
1502 assert!(!decoder.is_idle());
1503 assert!(decoder.finish_decoding().is_err());
1504
1505 let input = b"foobarba";
1506 assert_eq!(decoder.decode(input, Eos::new(false)).ok(), Some(0));
1507 assert!(decoder.is_idle());
1508 assert!(decoder.finish_decoding().is_ok());
1509 }
1510
1511 #[test]
1512 fn encoder_length_works() {
1513 let mut output = Vec::new();
1514 let mut encoder = Utf8Encoder::new().length(3);
1515 encoder.start_encoding("hey").unwrap(); track_try_unwrap!(encoder.encode_all(&mut output));
1517 assert_eq!(output, b"hey");
1518
1519 let mut output = Vec::new();
1520 let mut encoder = Utf8Encoder::new().length(3);
1521 encoder.start_encoding("hello").unwrap(); let error = encoder.encode_all(&mut output).expect_err("too long");
1523 assert_eq!(*error.kind(), ErrorKind::UnexpectedEos);
1524
1525 let mut output = Vec::new();
1526 let mut encoder = Utf8Encoder::new().length(3);
1527 encoder.start_encoding("hi").unwrap(); let error = encoder.encode_all(&mut output).expect_err("too short");
1529 assert_eq!(*error.kind(), ErrorKind::InvalidInput);
1530 }
1531
1532 #[test]
1533 fn repeat_works() {
1534 let mut output = Vec::new();
1535 let mut encoder = U8Encoder::new().repeat();
1536 encoder.start_encoding(0..4).unwrap();
1537 track_try_unwrap!(encoder.encode_all(&mut output));
1538 assert_eq!(output, [0, 1, 2, 3]);
1539 }
1540
1541 #[test]
1542 fn decoder_max_bytes_works() {
1543 let mut decoder = Utf8Decoder::new().max_bytes(3);
1544 assert!(decoder.decode_from_bytes(b"12").is_ok());
1545 assert!(decoder.decode_from_bytes(b"123").is_ok());
1546 assert!(decoder.decode_from_bytes(b"1234").is_err());
1547 }
1548
1549 #[test]
1550 fn encoder_max_bytes_works() {
1551 let mut encoder = Utf8Encoder::new().max_bytes(3);
1552
1553 let mut output = Vec::new();
1554 encoder.start_encoding("foo").unwrap(); encoder.encode_all(&mut output).unwrap();
1556 assert_eq!(output, b"foo");
1557
1558 let mut output = Vec::new();
1559 encoder.start_encoding("hello").unwrap(); let error = encoder.encode_all(&mut output).err().unwrap();
1561 assert_eq!(*error.kind(), ErrorKind::InvalidInput);
1562 }
1563
1564 #[test]
1565 fn decoder_slice_works() {
1566 let mut decoder0 = Utf8Decoder::new().length(3).slice();
1567 let mut decoder1 = Utf8Decoder::new().length(3).slice();
1568
1569 let eos = Eos::new(true);
1570 let input = b"fboaor";
1571 let mut offset = 0;
1572
1573 for _ in 0..3 {
1574 decoder0.set_consumable_bytes(1);
1575 offset += track_try_unwrap!(decoder0.decode(&input[offset..], eos));
1576
1577 decoder1.set_consumable_bytes(1);
1578 offset += track_try_unwrap!(decoder1.decode(&input[offset..], eos));
1579 }
1580
1581 assert_eq!(offset, input.len());
1582 assert_eq!(decoder0.finish_decoding().ok(), Some("foo".to_owned()));
1583 assert_eq!(decoder1.finish_decoding().ok(), Some("bar".to_owned()));
1584 }
1585
1586 #[test]
1587 fn encoder_slice_works() {
1588 let mut encoder = Utf8Encoder::new().slice();
1589 encoder.start_encoding("foobarbazqux").unwrap();
1590
1591 let eos = Eos::new(true);
1592 let mut output = [0; 12];
1593 let mut offset = 0;
1594 encoder.set_consumable_bytes(3);
1595 offset += track_try_unwrap!(encoder.encode(&mut output[offset..], eos));
1596 assert_eq!(offset, 3);
1597 assert!(!encoder.is_idle());
1598
1599 offset += track_try_unwrap!(encoder.encode(&mut output[offset..], eos));
1600 assert_eq!(offset, 3);
1601 assert!(encoder.is_suspended());
1602
1603 encoder.set_consumable_bytes(3);
1604 offset += track_try_unwrap!(encoder.encode(&mut output[offset..], eos));
1605 assert_eq!(offset, 6);
1606
1607 encoder.set_consumable_bytes(6);
1608 offset += track_try_unwrap!(encoder.encode(&mut output[offset..], eos));
1609 assert_eq!(offset, 12);
1610
1611 assert!(encoder.is_idle());
1612 assert_eq!(output.as_ref(), b"foobarbazqux");
1613 }
1614
1615 #[test]
1616 fn and_then_works() {
1617 let mut decoder =
1618 U8Decoder::new().and_then(|len| Utf8Decoder::new().length(u64::from(len)));
1619 track_try_unwrap!(decoder.decode(b"\x03foo", Eos::new(false)));
1620 assert_eq!(track_try_unwrap!(decoder.finish_decoding()), "foo");
1621 }
1622
1623 #[test]
1624 fn maybe_eos_works() {
1625 let mut decoder = U16beDecoder::new();
1626 assert!(decoder.decode(&[][..], Eos::new(true)).is_err());
1627
1628 let mut decoder = U16beDecoder::new().maybe_eos();
1629 assert!(decoder.decode(&[][..], Eos::new(true)).is_ok());
1630
1631 let mut decoder = U16beDecoder::new().maybe_eos();
1632 assert!(decoder.decode(&[1][..], Eos::new(false)).is_ok());
1633 assert!(decoder.decode(&[][..], Eos::new(true)).is_err());
1634 }
1635
1636 #[test]
1637 fn peekable_works() {
1638 let mut decoder =
1639 TupleDecoder::new((U8Decoder::new(), U8Decoder::new(), U8Decoder::new())).peekable();
1640 let size = decoder.decode(b"foo", Eos::new(false)).unwrap();
1641 assert_eq!(size, 3);
1642 assert_eq!(decoder.peek(), Some(&(b'f', b'o', b'o')));
1643 assert_eq!(decoder.finish_decoding().unwrap(), (b'f', b'o', b'o'));
1644 assert_eq!(decoder.peek(), None);
1645 }
1646}