silent/middleware/
middleware_trait.rs1use crate::core::next::Next;
2use crate::{Request, Response, Result};
3use async_trait::async_trait;
4
5#[async_trait]
6pub trait MiddleWareHandler: Send + Sync + 'static {
7 async fn handle(&self, _req: Request, _next: &Next) -> Result<Response>;
8}
9
10#[cfg(test)]
11mod tests {
12 use crate::{Handler, HandlerWrapper};
13 use std::sync::Arc;
14 use tracing::info;
15
16 use super::*;
17
18 struct TestMiddleWare {
19 count: u32,
20 }
21
22 #[async_trait]
23 impl MiddleWareHandler for TestMiddleWare {
24 async fn handle(&self, req: Request, next: &Next) -> Result<Response> {
25 info!("{}", self.count);
26 next.call(req).await
27 }
28 }
29
30 async fn hello_world(_req: Request) -> Result<String> {
31 Ok("Hello World".into())
32 }
33
34 #[tokio::test]
35 async fn test_middleware() -> Result<()> {
36 let handler_wrapper = HandlerWrapper::new(hello_world).arc();
37 let middleware1: Arc<dyn MiddleWareHandler> = Arc::new(TestMiddleWare { count: 1 });
38 let middleware2: Arc<dyn MiddleWareHandler> = Arc::new(TestMiddleWare { count: 2 });
39 let req = Request::empty();
40 let middlewares = Next::build(handler_wrapper, &[middleware1, middleware2]);
41 let res = middlewares.call(req).await;
42 assert!(res.is_ok());
43 info!("{:?}", res?);
44 Ok(())
45 }
46}