Study
Rocket

Validasi Data dengan Request Guard

Penjelasan

Kamu sudah belajar request guard untuk autentikasi (topik 8). Pola yang sama bisa dipakai untuk VALIDASI DATA lain, bukan cuma autentikasi — misalnya memvalidasi format ID khusus di path, atau memastikan header tertentu berformat benar sebelum handler-mu perlu memikirkannya sama sekali. Di Rocket, guard juga bisa dipakai untuk parameter PATH secara custom lewat trait `FromParam` (bukan `FromRequest`) — kalau kamu ingin path segment `<id>` langsung di-parsing jadi tipe custom (misalnya newtype `NoteId(u32)` yang memvalidasi rentang angka valid), implementasikan `FromParam` untuk tipe itu, lalu pakai langsung sebagai tipe parameter path. Perbedaan `FromRequest` vs `FromParam`: `FromRequest` untuk data yang sumbernya dari SELURUH request (header, cookie, state), sedangkan `FromParam` khusus untuk PARSING SATU SEGMEN PATH menjadi tipe custom dengan validasi tambahan di dalamnya.

Contoh Konsep

#[macro_use] extern crate rocket;

use rocket::request::FromParam;

struct NoteId(u32);

impl<'r> FromParam<'r> for NoteId {
    type Error = &'r str;

    fn from_param(param: &'r str) -> Result<Self, Self::Error> {
        match param.parse::<u32>() {
            Ok(n) if n > 0 => Ok(NoteId(n)),
            _ => Err(param),
        }
    }
}

#[get("/notes/<id>")]
fn get_note(id: NoteId) -> String {
    format!("Catatan dengan id valid: {}", id.0)
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![get_note])
}

// /notes/5    -> cocok, NoteId(5)
// /notes/0    -> tidak cocok (n harus > 0), Rocket balas 404
// /notes/abc  -> tidak cocok (bukan angka), Rocket balas 404

Praktikum

Implementasikan `FromParam` untuk `Slug` yang hanya valid kalau string-nya semua huruf kecil dan tidak mengandung spasi.

Editor Latihan

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

Tips

Kalau path tidak cocok karena `FromParam` gagal, Rocket TIDAK memberi tahu ALASAN kegagalan ke client secara default (langsung 404 generik) — kalau kamu ingin pesan error yang lebih informatif, pertimbangkan memakai request guard biasa (`FromRequest`) di dalam handler yang menerima `String` mentah dari path, lalu memvalidasi manual dan mengembalikan `AppError` kustom seperti pola Axum.