diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index d09aad9df6..484dbae740 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -7,7 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 # Unreleased -- None. +- **fixed:** Annotate panicking functions with `#[track_caller]` so the error + message points to where the user added the invalid router, rather than + somewhere internally in axum ([#1248]) + +[#1248]: https://github.com/tokio-rs/axum/pull/1248 # 0.5.16 (10. September, 2022) diff --git a/axum/src/routing/method_routing.rs b/axum/src/routing/method_routing.rs index e45b8a5336..7a0ff3bb5b 100644 --- a/axum/src/routing/method_routing.rs +++ b/axum/src/routing/method_routing.rs @@ -207,6 +207,7 @@ macro_rules! chained_service_fn { $name:ident, $method:ident ) => { $(#[$m])+ + #[track_caller] pub fn $name(self, svc: S) -> Self where S: Service, Response = Response, Error = E> @@ -271,6 +272,7 @@ macro_rules! chained_handler_fn { $name:ident, $method:ident ) => { $(#[$m])+ + #[track_caller] pub fn $name(self, handler: H) -> Self where H: Handler, @@ -585,6 +587,7 @@ where /// # axum::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap(); /// # }; /// ``` + #[track_caller] pub fn on(self, filter: MethodFilter, handler: H) -> Self where H: Handler, @@ -697,6 +700,7 @@ impl MethodRouter { /// # axum::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap(); /// # }; /// ``` + #[track_caller] pub fn on_service(self, filter: MethodFilter, svc: S) -> Self where S: Service, Response = Response, Error = E> @@ -809,8 +813,10 @@ impl MethodRouter { } #[doc = include_str!("../docs/method_routing/merge.md")] + #[track_caller] pub fn merge(mut self, other: MethodRouter) -> Self { // written using inner functions to generate less IR + #[track_caller] fn merge_inner(name: &str, first: Option, second: Option) -> Option { match (first, second) { (Some(_), Some(_)) => panic!( @@ -822,6 +828,7 @@ impl MethodRouter { } } + #[track_caller] fn merge_fallback( fallback: Fallback, fallback_other: Fallback, @@ -868,12 +875,14 @@ impl MethodRouter { self.layer(HandleErrorLayer::new(f)) } + #[track_caller] fn on_service_boxed_response_body(mut self, filter: MethodFilter, svc: S) -> Self where S: Service, Response = Response, Error = E> + Clone + Send + 'static, S::Future: Send + 'static, { // written using an inner function to generate less IR + #[track_caller] fn set_service( method_name: &str, out: &mut Option, diff --git a/axum/src/routing/mod.rs b/axum/src/routing/mod.rs index 2f711dc7c3..984f3b8678 100644 --- a/axum/src/routing/mod.rs +++ b/axum/src/routing/mod.rs @@ -121,6 +121,7 @@ where } #[doc = include_str!("../docs/routing/route.md")] + #[track_caller] pub fn route(mut self, path: &str, service: T) -> Self where T: Service, Response = Response, Error = Infallible> + Clone + Send + 'static, @@ -173,6 +174,7 @@ where self } + #[track_caller] fn set_node(&mut self, path: &str, id: RouteId) { let mut node = Arc::try_unwrap(Arc::clone(&self.node)).unwrap_or_else(|node| (*node).clone()); @@ -183,6 +185,7 @@ where } #[doc = include_str!("../docs/routing/nest.md")] + #[track_caller] pub fn nest(mut self, mut path: &str, svc: T) -> Self where T: Service, Response = Response, Error = Infallible> + Clone + Send + 'static, @@ -262,6 +265,7 @@ where } #[doc = include_str!("../docs/routing/merge.md")] + #[track_caller] pub fn merge(mut self, other: R) -> Self where R: Into>, @@ -477,6 +481,7 @@ where } } + #[track_caller] fn panic_on_matchit_error(&self, err: matchit::InsertError) { if self.nested_at_root { panic!(