Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace HasRoutes with Into<Router> #819

Merged
merged 3 commits into from
Mar 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions axum-extra/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@ and this project adheres to [Semantic Versioning].
- **breaking:** `CachedRejection` has been removed ([#699])
- **breaking:** `<Cached<T> as FromRequest>::Rejection` is now `T::Rejection`. ([#699])
- **breaking:** `middleware::from_fn` has been moved into the main axum crate ([#719])
- **breaking:** `HasRoutes` has been removed. `Router::merge` now accepts `Into<Router>` ([#819])
- **breaking:** `RouterExt::with` method has been removed. Use `Router::merge` instead. It works
identically ([#819])

[#666]: https://github.com/tokio-rs/axum/pull/666
[#699]: https://github.com/tokio-rs/axum/pull/699
[#719]: https://github.com/tokio-rs/axum/pull/719
[#756]: https://github.com/tokio-rs/axum/pull/756
[#790]: https://github.com/tokio-rs/axum/pull/790
[#819]: https://github.com/tokio-rs/axum/pull/819

# 0.1.2 (13. January, 2022)

Expand Down
48 changes: 1 addition & 47 deletions axum-extra/src/routing/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//! Additional types for defining routes.

use axum::{body::Body, handler::Handler, Router};
use axum::{handler::Handler, Router};

mod resource;

Expand All @@ -17,31 +17,6 @@ pub use self::typed::{FirstElementIs, TypedPath};

/// Extension trait that adds additional methods to [`Router`].
pub trait RouterExt<B>: sealed::Sealed {
/// Add the routes from `T`'s [`HasRoutes::routes`] to this router.
///
/// # Example
///
/// Using [`Resource`] which implements [`HasRoutes`]:
///
/// ```rust
/// use axum::{Router, routing::get};
/// use axum_extra::routing::{RouterExt, Resource};
///
/// let app = Router::new()
/// .with(
/// Resource::named("users")
/// .index(|| async {})
/// .create(|| async {})
/// )
/// .with(
/// Resource::named("teams").index(|| async {})
/// );
/// # let _: Router<axum::body::Body> = app;
/// ```
fn with<T>(self, routes: T) -> Self
where
T: HasRoutes<B>;

/// Add a typed `GET` route to the router.
///
/// The path will be inferred from the first argument to the handler function which must
Expand Down Expand Up @@ -151,13 +126,6 @@ impl<B> RouterExt<B> for Router<B>
where
B: axum::body::HttpBody + Send + 'static,
{
fn with<T>(self, routes: T) -> Self
where
T: HasRoutes<B>,
{
self.merge(routes.routes())
}

#[cfg(feature = "typed-routing")]
fn typed_get<H, T, P>(self, handler: H) -> Self
where
Expand Down Expand Up @@ -239,20 +207,6 @@ where
}
}

/// Trait for things that can provide routes.
///
/// Used with [`RouterExt::with`].
pub trait HasRoutes<B = Body> {
/// Get the routes.
fn routes(self) -> Router<B>;
}

impl<B> HasRoutes<B> for Router<B> {
fn routes(self) -> Router<B> {
self
}
}

mod sealed {
pub trait Sealed {}
impl<B> Sealed for axum::Router<B> {}
Expand Down
12 changes: 5 additions & 7 deletions axum-extra/src/routing/resource.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use super::HasRoutes;
use axum::{
body::Body,
handler::Handler,
Expand Down Expand Up @@ -45,7 +44,7 @@ use tower_service::Service;
/// Router::new().route("/featured", get(|| async {})),
/// );
///
/// let app = Router::new().with(users);
/// let app = Router::new().merge(users);
/// # let _: Router<axum::body::Body> = app;
/// ```
#[derive(Debug)]
Expand Down Expand Up @@ -182,17 +181,16 @@ where
}
}

impl<B> HasRoutes<B> for Resource<B> {
fn routes(self) -> Router<B> {
self.router
impl<B> From<Resource<B>> for Router<B> {
fn from(resource: Resource<B>) -> Self {
resource.router
}
}

#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use super::*;
use crate::routing::RouterExt;
use axum::{extract::Path, http::Method, Router};
use tower::ServiceExt;

Expand All @@ -214,7 +212,7 @@ mod tests {
Router::new().route("/featured", get(|| async move { "users#featured" })),
);

let mut app = Router::new().with(users);
let mut app = Router::new().merge(users);

assert_eq!(
call_route(&mut app, Method::GET, "/users").await,
Expand Down
2 changes: 2 additions & 0 deletions axum/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **added:** `Extension<_>` can now be used in tuples for building responses, and will set an
extension on the response ([#797])
- **added:** Implement `tower::Layer` for `Extension` ([#801])
- **changed:** `Router::merge` now accepts `Into<Routes>` ([#819])
- **breaking:** `sse::Event` now accepts types implementing `AsRef<str>` instead of `Into<String>`
as field values.
- **breaking:** `sse::Event` now panics if a setter method is called twice instead of silently
Expand Down Expand Up @@ -80,6 +81,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#800]: https://github.com/tokio-rs/axum/pull/800
[#801]: https://github.com/tokio-rs/axum/pull/801
[#807]: https://github.com/tokio-rs/axum/pull/807
[#819]: https://github.com/tokio-rs/axum/pull/819

# 0.4.4 (13. January, 2022)

Expand Down
7 changes: 5 additions & 2 deletions axum/src/routing/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,13 +245,16 @@ where
}

#[doc = include_str!("../docs/routing/merge.md")]
pub fn merge(mut self, other: Router<B>) -> Self {
pub fn merge<R>(mut self, other: R) -> Self
where
R: Into<Router<B>>,
{
let Router {
routes,
node,
fallback,
nested_at_root,
} = other;
} = other.into();

for (id, route) in routes {
let path = node
Expand Down