Study
Axum

Nested Router

Penjelasan

Seiring aplikasi bertambah besar, mendaftarkan semua route dalam satu `Router` di `main` jadi tidak rapi. Axum menyediakan `.nest(prefix, router)` untuk memasang sebuah `Router` sebagai sub-router di bawah prefix path tertentu. Pola yang umum dipakai: setiap "modul" fitur (misalnya notes, users, auth) punya fungsi sendiri yang mengembalikan `Router`, lalu di `main` semuanya digabung dengan `.nest("/notes", notes_routes())`, `.nest("/users", users_routes())`, dan seterusnya. Path di dalam sub-router ditulis relatif terhadap prefix — jadi kalau di dalam `notes_routes()` ada `.route("/{id}", ...)`, path lengkapnya otomatis jadi `/notes/{id}`. Berbeda dengan `.merge()` yang menggabungkan dua router pada level yang sama (tanpa prefix tambahan), `.nest()` selalu menambahkan prefix path baru. Pilih `.nest()` kalau kamu memang ingin pengelompokan path yang jelas per fitur.

Contoh Konsep

use axum::{extract::Path, routing::get, Router};

async fn list_notes() -> &'static str { "daftar catatan" }
async fn get_note(Path(id): Path<u32>) -> String { format!("catatan {}", id) }

async fn list_users() -> &'static str { "daftar user" }

fn notes_routes() -> Router {
    Router::new()
        .route("/", get(list_notes))
        .route("/{id}", get(get_note))
}

fn users_routes() -> Router {
    Router::new().route("/", get(list_users))
}

#[tokio::main]
async fn main() {
    let app = Router::new()
        .nest("/notes", notes_routes())   // -> /notes, /notes/{id}
        .nest("/users", users_routes());  // -> /users

    let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

Praktikum

Buat fungsi `auth_routes()` yang mengembalikan Router dengan route "/login" (POST), lalu nest-kan ke prefix "/auth".

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

State yang didaftarkan lewat `.with_state()` di router induk otomatis diwariskan ke seluruh sub-router yang di-nest, jadi kamu tidak perlu memanggil `.with_state()` berulang kali di setiap fungsi route module — cukup satu kali di `main` setelah semua `.nest()` dan `.route()` terpasang.