1Merge two routers into one.
2
3This is useful for breaking apps into smaller pieces and combining them
4into one.
5
6```rust
7use axum::{
8    routing::get,
9    Router,
10};
11#
12# async fn users_list() {}
13# async fn users_show() {}
14# async fn teams_list() {}
15
16// define some routes separately
17let user_routes = Router::new()
18    .route("/users", get(users_list))
19    .route("/users/:id", get(users_show));
20
21let team_routes = Router::new()
22    .route("/teams", get(teams_list));
23
24// combine them into one
25let app = Router::new()
26    .merge(user_routes)
27    .merge(team_routes);
28
29// could also do `user_routes.merge(team_routes)`
30
31// Our app now accepts
32// - GET /users
33// - GET /users/:id
34// - GET /teams
35# async {
36# hyper::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap();
37# };
38```
39
40# Merging routers with state
41
42When combining [`Router`]s with this method, each [`Router`] must have the
43same type of state. If your routers have different types you can use
44[`Router::with_state`] to provide the state and make the types match:
45
46```rust
47use axum::{
48    Router,
49    routing::get,
50    extract::State,
51};
52
53#[derive(Clone)]
54struct InnerState {}
55
56#[derive(Clone)]
57struct OuterState {}
58
59async fn inner_handler(state: State<InnerState>) {}
60
61let inner_router = Router::new()
62    .route("/bar", get(inner_handler))
63    .with_state(InnerState {});
64
65async fn outer_handler(state: State<OuterState>) {}
66
67let app = Router::new()
68    .route("/", get(outer_handler))
69    .merge(inner_router)
70    .with_state(OuterState {});
71# let _: axum::Router = app;
72```
73
74# Panics
75
76- If two routers that each have a [fallback](Router::fallback) are merged. This
77  is because `Router` only allows a single fallback.
78