puzz_http/body/
map_err.rs1use 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}