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()`.
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.