ayun_server/router/
mod.rs1use crate::{traits::MiddlewareTrait, Middleware};
2
3#[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 #[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"); }
106
107 router
108 }
109}