boluo_core/middleware/
middleware_fn.rs

1use super::Middleware;
2
3/// 将给定的闭包转换为 [`Middleware`]。
4///
5/// # 例子
6///
7/// ```
8/// use boluo_core::handler::handler_fn;
9/// use boluo_core::middleware::middleware_fn;
10/// use boluo_core::request::Request;
11/// use boluo_core::service::{Service, ServiceExt};
12///
13/// fn add_extension<S>(service: S) -> impl Service<Request>
14/// where
15///     S: Service<Request>,
16/// {
17///     service.map_request(|mut req: Request| {
18///         req.extensions_mut().insert("My Extension");
19///         req
20///     })
21/// }
22///
23/// let service = handler_fn(|| async {});
24/// let service = service.with(middleware_fn(add_extension));
25/// ```
26pub fn middleware_fn<F>(f: F) -> MiddlewareFn<F> {
27    MiddlewareFn { f }
28}
29
30/// 将给定的闭包转换为 [`Middleware`]。
31#[derive(Clone, Copy)]
32pub struct MiddlewareFn<F> {
33    f: F,
34}
35
36impl<F, S1, S2> Middleware<S1> for MiddlewareFn<F>
37where
38    F: FnOnce(S1) -> S2,
39{
40    type Service = S2;
41
42    fn transform(self, service: S1) -> Self::Service {
43        (self.f)(service)
44    }
45}
46
47impl<F> std::fmt::Debug for MiddlewareFn<F> {
48    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49        f.debug_struct("MiddlewareFn")
50            .field("f", &std::any::type_name::<F>())
51            .finish()
52    }
53}