miku_http_util/request/parser/integration/
integrate_axum.rs1use axum::{extract::Request, handler::Handler};
4
5use super::parse_query;
6
7#[macro_export]
8macro_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)]
16pub struct WithQueryHandler<H> {
18 inner: H,
19 required: &'static [&'static str],
20}
21
22impl<H> WithQueryHandler<H> {
23 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}