async_codec_util/decoder/
map.rs1use async_codec::{AsyncDecode, PollDec};
2use async_codec::PollDec::{Done, Progress, Pending, Errored};
3use futures_core::task::Context;
4use futures_io::AsyncRead;
5
6pub struct Map<D, F> {
8 dec: D,
9 f: F,
10}
11
12impl<D, F> Map<D, F> {
13 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}