async_codec_util/decoder/
map.rs

1use async_codec::{AsyncDecode, PollDec};
2use async_codec::PollDec::{Done, Progress, Pending, Errored};
3use futures_core::task::Context;
4use futures_io::AsyncRead;
5
6/// Change the return type of a decoder by mapping its item through a function.
7pub struct Map<D, F> {
8    dec: D,
9    f: F,
10}
11
12impl<D, F> Map<D, F> {
13    /// Chain a compution on the result of a decoder.
14    pub fn new(dec: D, f: F) -> Map<D, F> {
15        Map { dec, f }
16    }
17}
18
19impl<D, F, U> AsyncDecode for Map<D, F>
20    where D: AsyncDecode,
21          F: FnOnce(D::Item) -> U
22{
23    type Item = U;
24    type Error = D::Error;
25
26    fn poll_decode<R: AsyncRead>(mut self,
27                                 cx: &mut Context,
28                                 reader: &mut R)
29                                 -> PollDec<Self::Item, Self, Self::Error> {
30        match self.dec.poll_decode(cx, reader) {
31            Done(item, read) => Done((self.f)(item), read),
32            Progress(dec, read) => {
33                self.dec = dec;
34                Progress(self, read)
35            }
36            Pending(dec) => {
37                self.dec = dec;
38                Pending(self)
39            }
40            Errored(err) => Errored(err),
41        }
42    }
43}