Skip to main content

doido_controller/
stack.rs

1use axum::{middleware::from_fn, Router};
2use tower_http::{catch_panic::CatchPanicLayer, cors::CorsLayer};
3
4pub struct MiddlewareStack {
5    cors: bool,
6}
7
8impl MiddlewareStack {
9    pub fn new() -> Self {
10        Self { cors: false }
11    }
12
13    pub fn with_cors(mut self) -> Self {
14        self.cors = true;
15        self
16    }
17
18    pub fn apply(self, router: Router) -> Router {
19        // Log every request and its response (method, path, status, latency)
20        // through doido's centralized logger. Added after `CatchPanicLayer` so
21        // it sits outermost and logs panic-recovered `500`s too.
22        let mut r = router
23            .layer(CatchPanicLayer::new())
24            .layer(from_fn(crate::logging::log_requests));
25        if self.cors {
26            r = r.layer(CorsLayer::permissive());
27        }
28        r
29    }
30}
31
32impl Default for MiddlewareStack {
33    fn default() -> Self {
34        Self::new()
35    }
36}