Study
Rocket

Managed State

Penjelasan

Konsep managed state di Rocket setara dengan `State<T>` di Axum, tapi cara pendaftarannya lewat method builder `.manage(nilai)` pada instance Rocket, dan cara aksesnya di handler lewat parameter bertipe `&State<T>` (referensi, bukan owned value). Berbeda dari Axum yang mewajibkan kamu membungkus state dengan `Arc` secara manual, Rocket sudah menangani sharing state secara internal — kamu cukup memanggil `.manage(MyState { ... })` sekali di fungsi `rocket()`, dan Rocket menjamin nilai itu bisa diakses aman dari banyak request bersamaan lewat `&State<T>`. Kalau field di dalam state perlu diubah, kamu tetap perlu membungkusnya sendiri dengan `Mutex` atau `RwLock` seperti biasa — Rocket hanya menangani BAGAIMANA state di-share, bukan mutasi datanya. Satu instance Rocket hanya boleh punya SATU nilai `.manage()` per tipe data — kalau kamu panggil `.manage()` dua kali dengan tipe yang sama, panggilan kedua akan menimpa yang pertama.

Contoh Konsep

#[macro_use] extern crate rocket;

use rocket::State;

struct AppState {
    app_name: String,
}

#[get("/")]
fn show_name(state: &State<AppState>) -> String {
    format!("Nama aplikasi: {}", state.app_name)
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .manage(AppState { app_name: "Catatan API".to_string() })
        .mount("/", routes![show_name])
}

Praktikum

Buat `AppState` dengan field `version: String`, lalu handler `show_version` yang menampilkannya, dan daftarkan lewat `.manage()`.

Editor Latihan

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

Tips

Kalau lupa memanggil `.manage(...)` sebelum sebuah handler memakai `&State<T>`, kesalahannya BARU muncul saat RUNTIME (bukan compile-time) — Rocket akan mencatat error di log dan mengembalikan 500 untuk request yang mengenai handler tersebut. Ini pengecualian dari kebiasaan Rocket yang biasanya mengecek banyak hal saat kompilasi, jadi selalu double-check semua `.manage()` sudah terpasang sebelum deploy.