ayun_server/router/
mod.rs

1use crate::{traits::MiddlewareTrait, Middleware};
2
3// https://github.com/tower-rs/tower/issues/496
4#[derive(Default)]
5pub struct Router {
6    inner: axum::Router,
7    middlewares: Vec<(String, Middleware)>,
8}
9
10impl Router {
11    pub fn new() -> Self {
12        #[allow(unused_mut)]
13        let mut router = Self::default();
14
15        // todo need runtime
16        // https://github.com/tokio-rs/axum/issues/2634
17        // #[cfg(feature = "middleware-rate-limit")]
18        // router = router.middleware::<crate::middleware::RateLimit>();
19
20        #[cfg(feature = "middleware-fallback")]
21        {
22            router = router.middleware::<crate::middleware::Fallback>();
23        }
24
25        #[cfg(feature = "middleware-cors")]
26        {
27            router = router.middleware::<crate::middleware::Cors>();
28        }
29
30        #[cfg(feature = "middleware-body-limit")]
31        {
32            router = router.middleware::<crate::middleware::BodyLimit>();
33        }
34
35        #[cfg(feature = "middleware-asset")]
36        {
37            router = router.middleware::<crate::middleware::Asset>();
38        }
39
40        #[cfg(feature = "middleware-compression")]
41        {
42            router = router.middleware::<crate::middleware::Compression>();
43        }
44
45        #[cfg(feature = "middleware-decompression")]
46        {
47            router = router.middleware::<crate::middleware::Decompression>();
48        }
49
50        #[cfg(feature = "middleware-set-sensitive-request-headers")]
51        {
52            router = router.middleware::<crate::middleware::SetSensitiveRequestHeaders>();
53        }
54
55        #[cfg(feature = "middleware-request-id")]
56        {
57            router = router.middleware::<crate::middleware::RequestId>();
58        }
59
60        #[cfg(feature = "middleware-tracing")]
61        {
62            router = router.middleware::<crate::middleware::Tracing>();
63        }
64
65        #[cfg(feature = "middleware-catch-panic")]
66        {
67            router = router.middleware::<crate::middleware::CatchPanic>();
68        }
69
70        #[cfg(feature = "middleware-timeout")]
71        {
72            router = router.middleware::<crate::middleware::Timeout>();
73        }
74
75        router
76    }
77
78    pub fn route(mut self, path: &str, method_router: axum::routing::MethodRouter<()>) -> Self {
79        self.inner = self.inner.route(path, method_router);
80
81        self
82    }
83
84    pub fn middleware<T: MiddlewareTrait>(mut self) -> Self {
85        self.middlewares.push((T::name(), T::handle()));
86
87        self
88    }
89}
90
91impl From<Router> for axum::Router {
92    fn from(mut value: Router) -> Self {
93        let mut router = value.inner;
94        let mut middlewares = vec![];
95
96        while let Some((name, layer)) = value.middlewares.pop() {
97            router = layer(router)
98                .unwrap_or_else(|err| panic!("[middleware] `{name}` applied error: {err}"));
99
100            middlewares.push(name);
101        }
102
103        while let Some(middleware) = middlewares.pop() {
104            tracing::info!("[middleware] `{middleware}` successfully applied"); // todo different route may has different middlewares
105        }
106
107        router
108    }
109}