Skip to main content

silent/middleware/
middleware_trait.rs

1use 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}