bytecodec/
combinator.rs

1//! Encoders and decoders for combination.
2//!
3//! These are mainly created via the methods provided by `EncodeExt` or `DecodeExt` traits.
4use 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/// Combinator for converting decoded items to other values.
14///
15/// This is created by calling `DecodeExt::map` method.
16#[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    /// Returns a reference to the inner decoder.
24    pub fn inner_ref(&self) -> &D {
25        &self.inner
26    }
27
28    /// Returns a mutable reference to the inner decoder.
29    pub fn inner_mut(&mut self) -> &mut D {
30        &mut self.inner
31    }
32
33    /// Takes ownership of this instance and returns the inner decoder.
34    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/// Combinator for modifying encoding/decoding errors.
75///
76/// This is created by calling `{DecodeExt, EncodeExt}::map_err` method.
77#[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    /// Returns a reference to the inner encoder or decoder.
85    pub fn inner_ref(&self) -> &C {
86        &self.inner
87    }
88
89    /// Returns a mutable reference to the inner encoder or decoder.
90    pub fn inner_mut(&mut self) -> &mut C {
91        &mut self.inner
92    }
93
94    /// Takes ownership of this instance and returns the inner encoder or decoder.
95    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/// Combinator for conditional decoding.
179///
180/// If the first item is successfully decoded,
181/// it will start decoding the second item by using the decoder returned by `f` function.
182///
183/// This is created by calling `DecodeExt::and_then` method.
184#[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/// Combinator for converting items into ones that
242/// suited to the inner encoder by calling the given function.
243///
244/// This is created by calling `EncodeExt::map_from` method.
245#[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    /// Returns a reference to the inner encoder.
253    pub fn inner_ref(&self) -> &E {
254        &self.inner
255    }
256
257    /// Returns a mutable reference to the inner encoder.
258    pub fn inner_mut(&mut self) -> &mut E {
259        &mut self.inner
260    }
261
262    /// Takes ownership of this instance and returns the inner encoder.
263    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/// Combinator that tries to convert items into ones that
309/// suited to the inner encoder by calling the given function.
310///
311/// This is created by calling `EncodeExt::try_map_from` method.
312#[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    /// Returns a reference to the inner encoder.
320    pub fn inner_ref(&self) -> &C {
321        &self.inner
322    }
323
324    /// Returns a mutable reference to the inner encoder.
325    pub fn inner_mut(&mut self) -> &mut C {
326        &mut self.inner
327    }
328
329    /// Takes ownership of this instance and returns the inner encoder.
330    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/// Combinator for repeating encoding of `E::Item`.
379///
380/// This is created by calling `EncodeExt::repeat` method.
381#[derive(Debug)]
382pub struct Repeat<E, I> {
383    inner: E,
384    items: Option<I>,
385}
386impl<E, I> Repeat<E, I> {
387    /// Returns a reference to the inner encoder.
388    pub fn inner_ref(&self) -> &E {
389        &self.inner
390    }
391
392    /// Returns a mutable reference to the inner encoder.
393    pub fn inner_mut(&mut self) -> &mut E {
394        &mut self.inner
395    }
396
397    /// Takes ownership of this instance and returns the inner encoder.
398    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/// Combinator for representing optional decoders.
458///
459/// This is created by calling `DecodeExt::omit` method.
460#[derive(Debug, Default)]
461pub struct Omittable<D> {
462    inner: D,
463    do_omit: bool,
464}
465impl<D> Omittable<D> {
466    /// Returns a reference to the inner decoder.
467    pub fn inner_ref(&self) -> &D {
468        &self.inner
469    }
470
471    /// Returns a mutable reference to the inner decoder.
472    pub fn inner_mut(&mut self) -> &mut D {
473        &mut self.inner
474    }
475
476    /// Takes ownership of this instance and returns the inner decoder.
477    pub fn into_inner(self) -> D {
478        self.inner
479    }
480
481    /// If `true` is specified, the decoder will consume no bytes and
482    /// return `Ok((0, None))` when `decode` method is called.
483    pub fn do_omit(&mut self, b: bool) {
484        self.do_omit = b;
485    }
486
487    /// Returns `true` if the decoder will omit to decode items, otherwise `false`.
488    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/// Combinator for representing an optional encoder.
529#[derive(Debug, Default)]
530pub struct Optional<E>(E);
531impl<E> Optional<E> {
532    /// Returns a reference to the inner encoder.
533    pub fn inner_ref(&self) -> &E {
534        &self.0
535    }
536
537    /// Returns a mutable reference to the inner encoder.
538    pub fn inner_mut(&mut self) -> &mut E {
539        &mut self.0
540    }
541
542    /// Takes ownership of this instance and returns the inner encoder.
543    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/// Combinator for collecting decoded items.
580///
581/// `Collect` decodes all items until it reaches EOS
582/// and returns the collected items as the single decoded item.
583///
584/// This is created by calling `DecodeExt::collect` method.
585#[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    /// Returns a reference to the inner decoder.
593    pub fn inner_ref(&self) -> &D {
594        &self.inner
595    }
596
597    /// Returns a mutable reference to the inner decoder.
598    pub fn inner_mut(&mut self) -> &mut D {
599        &mut self.inner
600    }
601
602    /// Takes ownership of this instance and returns the inner decoder.
603    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/// Combinator for consuming the specified number of bytes exactly.
661///
662/// This is created by calling `{DecodeExt, EncodeExt}::length` method.
663#[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    /// Returns the number of bytes expected to be consumed for decoding an item.
679    pub fn expected_bytes(&self) -> u64 {
680        self.expected_bytes
681    }
682
683    /// Sets the number of bytes expected to be consumed for decoding an item.
684    ///
685    /// # Errors
686    ///
687    /// If it is in the middle of decoding an item, it willl return an `ErrorKind::IncompleteDecoding` error.
688    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    /// Returns the number of remaining bytes required to decode the next item.
701    pub fn remaining_bytes(&self) -> u64 {
702        self.remaining_bytes
703    }
704
705    /// Returns a reference to the inner encoder or decoder.
706    pub fn inner_ref(&self) -> &C {
707        &self.inner
708    }
709
710    /// Returns a mutable reference to the inner encoder or decoder.
711    pub fn inner_mut(&mut self) -> &mut C {
712        &mut self.inner
713    }
714
715    /// Takes ownership of this instance and returns the inner encoder or decoder.
716    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/// Combinator for decoding the specified number of items and collecting the result.
803///
804/// This is created by calling `DecodeExt::collectn` method.
805#[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    /// Returns the number of remaining items expected to be decoded.
813    pub fn remaining_items(&self) -> usize {
814        self.remaining_items
815    }
816
817    /// Sets the number of remaining items expected to be decoded.
818    pub fn set_remaining_items(&mut self, n: usize) {
819        self.remaining_items = n;
820    }
821
822    /// Returns a reference to the inner decoder.
823    pub fn inner_ref(&self) -> &D {
824        &self.inner
825    }
826
827    /// Returns a mutable reference to the inner decoder.
828    pub fn inner_mut(&mut self) -> &mut D {
829        &mut self.inner
830    }
831
832    /// Takes ownership of this instance and returns the inner decoder.
833    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/// Combinator which tries to convert decoded values by calling the specified function.
887///
888/// This is created by calling `DecodeExt::try_map` method.
889#[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    /// Returns a reference to the inner decoder.
897    pub fn inner_ref(&self) -> &D {
898        &self.inner
899    }
900
901    /// Returns a mutable reference to the inner decoder.
902    pub fn inner_mut(&mut self) -> &mut D {
903        &mut self.inner
904    }
905
906    /// Takes ownership of this instance and returns the inner decoder.
907    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/// Combinator that will fail if the number of consumed bytes exceeds the specified size.
946///
947/// This is created by calling `{DecodeExt, EncodeExt}::max_bytes` method.
948///
949/// Note that `MaxBytes` assumes the inner decoder will consume all the bytes in the target stream.
950#[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    /// Returns the number of bytes consumed for encoding/decoding the current item.
966    pub fn consumed_bytes(&self) -> u64 {
967        self.consumed_bytes
968    }
969
970    /// Returns the maximum number of bytes that can be consumed for encoding/decoding an item.
971    pub fn max_bytes(&self) -> u64 {
972        self.max_bytes
973    }
974
975    /// Sets the maximum number of bytes that can be consumed for encoding/decoding an item.
976    ///
977    /// # Error
978    ///
979    /// If `n` is smaller than `self.consumed_bytes()`, an `ErrorKind::InvalidInput` error will be returned.
980    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    /// Returns a reference to the inner encoder or decoder.
992    pub fn inner_ref(&self) -> &C {
993        &self.inner
994    }
995
996    /// Returns a mutable reference to the inner encoder or decoder.
997    pub fn inner_mut(&mut self) -> &mut C {
998        &mut self.inner
999    }
1000
1001    /// Takes ownership of this instance and returns the inner encoder or decoder.
1002    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/// Combinator for pre-encoding items when `start_encoding` method is called.
1081///
1082/// This is created by calling `EncodeExt::pre_encode` method.
1083#[derive(Debug, Default)]
1084pub struct PreEncode<E> {
1085    inner: E,
1086    pre_encoded: BytesEncoder<Vec<u8>>,
1087}
1088impl<E> PreEncode<E> {
1089    /// Returns a reference to the inner encoder.
1090    pub fn inner_ref(&self) -> &E {
1091        &self.inner
1092    }
1093
1094    /// Returns a mutable reference to the inner encoder.
1095    pub fn inner_mut(&mut self) -> &mut E {
1096        &mut self.inner
1097    }
1098
1099    /// Takes ownership of this instance and returns the inner encoder.
1100    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/// Combinator for slicing an input/output byte sequence by the specified number of bytes.
1139///
1140/// This is created by calling `{DecodeExt, EncodeExt}::slice`.
1141#[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    /// Returns the number of remaining bytes consumable in this slice.
1155    ///
1156    /// The inner decoder or encoder will be suspended if the consumable bytes reaches to `0`.
1157    pub fn consumable_bytes(&self) -> u64 {
1158        self.consumable_bytes
1159    }
1160
1161    /// Set the number of remaining bytes consumable in this slice.
1162    pub fn set_consumable_bytes(&mut self, n: u64) {
1163        self.consumable_bytes = n;
1164    }
1165
1166    /// Returns `true` if the encoder or decoder cannot consume any more bytes, otherwise `false`.
1167    ///
1168    /// To resume its works, it is needed to reset the value of consumable bytes
1169    /// by calling `set_consumable_bytes` method.
1170    pub fn is_suspended(&self) -> bool {
1171        self.consumable_bytes == 0
1172    }
1173
1174    /// Returns a reference to the inner encoder or decoder.
1175    pub fn inner_ref(&self) -> &T {
1176        &self.inner
1177    }
1178
1179    /// Returns a mutable reference to the inner encoder or decoder.
1180    pub fn inner_mut(&mut self) -> &mut T {
1181        &mut self.inner
1182    }
1183
1184    /// Takes ownership of this instance and returns the inner encoder or decoder.
1185    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/// Combinator for representing encoders that accepts only one additional item.
1242///
1243/// This is created by calling `EncodeExt::last`.
1244#[derive(Debug, Default)]
1245pub struct Last<E: Encode> {
1246    inner: E,
1247    item: Option<E::Item>,
1248}
1249impl<E: Encode> Last<E> {
1250    /// Returns a reference to the inner encoder.
1251    pub fn inner_ref(&self) -> &E {
1252        &self.inner
1253    }
1254
1255    /// Returns a mutable reference to the inner encoder.
1256    pub fn inner_mut(&mut self) -> &mut E {
1257        &mut self.inner
1258    }
1259
1260    /// Takes ownership of this instance and returns the inner encoder.
1261    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
1306/// Combinator that enables to peek decoded items before calling `finish_decoding` method.
1307///
1308/// This is created by calling `DecodeExt::peekable` method.
1309pub struct Peekable<D: Decode> {
1310    inner: D,
1311    item: Option<D::Item>,
1312}
1313impl<D: Decode> Peekable<D> {
1314    /// Returns a reference to the last item decoded (but not `finish_decoding` called yet) by the decoder.
1315    pub fn peek(&self) -> Option<&D::Item> {
1316        self.item.as_ref()
1317    }
1318
1319    /// Returns a mutable reference to the last item decoded (but not `finish_decoding` called yet) by the decoder.
1320    pub fn peek_mut(&mut self) -> Option<&mut D::Item> {
1321        self.item.as_mut()
1322    }
1323
1324    /// Returns a reference to the inner decoder.
1325    pub fn inner_ref(&self) -> &D {
1326        &self.inner
1327    }
1328
1329    /// Returns a mutable reference to the inner decoder.
1330    pub fn inner_mut(&mut self) -> &mut D {
1331        &mut self.inner
1332    }
1333
1334    /// Takes ownership of this instance and returns the inner decoder.
1335    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/// Combinator for ignoring EOS if there is no item being decoded.
1395///
1396/// This is created by calling `DecodeExt::maybe_eos`.
1397#[derive(Debug, Default)]
1398pub struct MaybeEos<D> {
1399    inner: D,
1400    started: bool,
1401}
1402impl<D> MaybeEos<D> {
1403    /// Returns a reference to the inner decoder.
1404    pub fn inner_ref(&self) -> &D {
1405        &self.inner
1406    }
1407
1408    /// Returns a mutable reference to the inner decoder.
1409    pub fn inner_mut(&mut self) -> &mut D {
1410        &mut self.inner
1411    }
1412
1413    /// Takes ownership of this instance and returns the inner decoder.
1414    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        // length=3
1488        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        // length=0
1501        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(); // OK
1516        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(); // Error (too long)
1522        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(); // Error (too short)
1528        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(); // OK
1555        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(); // Error
1560        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}