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}