miku_http_util/request/parser/integration/
integrate_axum.rs

1//! `axum` integration for [`OwnedQuery`](OwnedQuery).
2
3use axum::{extract::Request, handler::Handler};
4
5use super::parse_query;
6
7#[macro_export]
8/// Just [`WithQueryHandler::new`].
9macro_rules! query_keys_required {
10    ($handler:expr => $required:expr) => {
11        $crate::request::parser::integration::WithQueryHandler::new($handler, $required)
12    };
13}
14
15#[derive(Debug, Clone, Copy)]
16/// Wrapper over handler
17pub struct WithQueryHandler<H> {
18    inner: H,
19    required: &'static [&'static str],
20}
21
22impl<H> WithQueryHandler<H> {
23    /// Create a new [`WithQueryHandler`].
24    pub const fn new(inner: H, required: &'static [&'static str]) -> Self {
25        Self { inner, required }
26    }
27}
28
29impl<H, T, S> Handler<T, S> for WithQueryHandler<H>
30where
31    H: Handler<T, S>,
32{
33    type Future = H::Future;
34
35    fn call(self, mut req: Request, state: S) -> Self::Future {
36        parse_query(&mut req, self.required);
37
38        self.inner.call(req, state)
39    }
40}
41
42#[cfg(test)]
43mod test {
44    use axum::{extract::Request, response::IntoResponse, routing::get, Router};
45
46    #[test]
47    fn test() {
48        let _app: Router<()> = Router::new()
49            .route("/", get(test_router))
50            .route("/test", get(query_keys_required!(test_router => &["hey"])));
51    }
52
53    async fn test_router(_request: Request) -> impl IntoResponse {
54        "Hello world!"
55    }
56}