puzz_http/body/
map_err.rs

1use std::fmt;
2use std::pin::Pin;
3use std::task::{Context, Poll};
4
5use bytes::Bytes;
6use pin_project_lite::pin_project;
7
8use super::{Body, SizeHint};
9
10pin_project! {
11    #[derive(Clone, Copy)]
12    pub struct MapErr<B, F> {
13        #[pin]
14        inner: B,
15        f: F
16    }
17}
18
19impl<B, F> MapErr<B, F> {
20    pub(crate) fn new(body: B, f: F) -> Self {
21        Self { inner: body, f }
22    }
23
24    pub fn get_ref(&self) -> &B {
25        &self.inner
26    }
27
28    pub fn get_mut(&mut self) -> &mut B {
29        &mut self.inner
30    }
31
32    pub fn get_pin_mut(self: Pin<&mut Self>) -> Pin<&mut B> {
33        self.project().inner
34    }
35
36    pub fn into_inner(self) -> B {
37        self.inner
38    }
39}
40
41impl<B, F, E> Body for MapErr<B, F>
42where
43    B: Body,
44    F: FnMut(B::Error) -> E,
45{
46    type Error = E;
47
48    fn poll_next(
49        self: Pin<&mut Self>,
50        cx: &mut Context<'_>,
51    ) -> Poll<Option<Result<Bytes, Self::Error>>> {
52        let this = self.project();
53        match this.inner.poll_next(cx) {
54            Poll::Pending => Poll::Pending,
55            Poll::Ready(None) => Poll::Ready(None),
56            Poll::Ready(Some(Ok(data))) => Poll::Ready(Some(Ok(data))),
57            Poll::Ready(Some(Err(err))) => Poll::Ready(Some(Err((this.f)(err)))),
58        }
59    }
60
61    fn size_hint(&self) -> SizeHint {
62        self.inner.size_hint()
63    }
64}
65
66impl<B, F> fmt::Debug for MapErr<B, F>
67where
68    B: fmt::Debug,
69{
70    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
71        f.debug_struct("MapErr")
72            .field("inner", &self.inner)
73            .field("f", &std::any::type_name::<F>())
74            .finish()
75    }
76}