1use std::{
2 fmt,
3 future::Future,
4 task::{Context, Poll},
5};
6use tower_layer::Layer;
7use tower_service::Service;
8
9#[derive(Clone)]
13pub struct MapFuture<S, F> {
14 inner: S,
15 f: F,
16}
17
18impl<S, F> MapFuture<S, F> {
19 pub const fn new(inner: S, f: F) -> Self {
21 Self { inner, f }
22 }
23
24 pub fn layer(f: F) -> MapFutureLayer<F> {
30 MapFutureLayer::new(f)
31 }
32
33 pub fn get_ref(&self) -> &S {
35 &self.inner
36 }
37
38 pub fn get_mut(&mut self) -> &mut S {
40 &mut self.inner
41 }
42
43 pub fn into_inner(self) -> S {
45 self.inner
46 }
47}
48
49impl<R, S, F, T, E, Fut> Service<R> for MapFuture<S, F>
50where
51 S: Service<R>,
52 F: FnMut(S::Future) -> Fut,
53 E: From<S::Error>,
54 Fut: Future<Output = Result<T, E>>,
55{
56 type Response = T;
57 type Error = E;
58 type Future = Fut;
59
60 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
61 self.inner.poll_ready(cx).map_err(From::from)
62 }
63
64 fn call(&mut self, req: R) -> Self::Future {
65 (self.f)(self.inner.call(req))
66 }
67}
68
69impl<S, F> fmt::Debug for MapFuture<S, F>
70where
71 S: fmt::Debug,
72{
73 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
74 f.debug_struct("MapFuture")
75 .field("inner", &self.inner)
76 .field("f", &format_args!("{}", std::any::type_name::<F>()))
77 .finish()
78 }
79}
80
81#[derive(Clone)]
85pub struct MapFutureLayer<F> {
86 f: F,
87}
88
89impl<F> MapFutureLayer<F> {
90 pub const fn new(f: F) -> Self {
92 Self { f }
93 }
94}
95
96impl<S, F> Layer<S> for MapFutureLayer<F>
97where
98 F: Clone,
99{
100 type Service = MapFuture<S, F>;
101
102 fn layer(&self, inner: S) -> Self::Service {
103 MapFuture::new(inner, self.f.clone())
104 }
105}
106
107impl<F> fmt::Debug for MapFutureLayer<F> {
108 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109 f.debug_struct("MapFutureLayer")
110 .field("f", &format_args!("{}", std::any::type_name::<F>()))
111 .finish()
112 }
113}