zon_middleware/
map_response.rs1use std::future::Future;
2
3use zon_core::{HttpMiddleware, HttpService};
4
5#[derive(Clone, Copy, Debug)]
11pub struct MapResponse<F> {
12 map_fn: F,
13}
14
15impl<F> MapResponse<F> {
16 pub fn new(map_fn: F) -> Self {
17 Self { map_fn }
18 }
19}
20
21impl<S, F> HttpMiddleware<S> for MapResponse<F> {
22 type Service = MapResponseService<S, F>;
23
24 fn apply(self, inner: S) -> Self::Service {
25 MapResponseService::new(inner, self.map_fn)
26 }
27}
28
29pub struct MapResponseService<S, F> {
30 inner: S,
31 map_fn: F,
32}
33
34impl<S, F> MapResponseService<S, F> {
35 pub fn new(inner: S, map_fn: F) -> Self {
36 Self { inner, map_fn }
37 }
38}
39
40impl<S, F, Fut, B, ResB> HttpService<B> for MapResponseService<S, F>
41where
42 S: HttpService<B>,
43 F: Fn(http::Response<S::ResponseBody>) -> Fut + Sync,
44 Fut: Future<Output = http::Response<ResB>> + Send,
45 B: Send,
46{
47 type ResponseBody = ResB;
48
49 async fn call(&self, request: http::Request<B>) -> http::Response<Self::ResponseBody> {
50 let response = self.inner.call(request).await;
51 (self.map_fn)(response).await
52 }
53}