#[macro_use] extern crate rocket; #[cfg(test)] mod tests; #[derive(FromFormField)] enum Lang { #[field(value = "en")] English, #[field(value = "ru")] #[field(value = "ру")] Russian } #[derive(FromForm)] struct Options<'r> { emoji: bool, name: Option<&'r str>, } // Try visiting: // http://127.0.0.1:8000/hello/world #[get("/world")] fn world() -> &'static str { "Hello, world!" } // Try visiting: // http://127.0.0.1:8000/hello/мир #[get("/мир")] fn mir() -> &'static str { "Привет, мир!" } // Try visiting: // http://127.0.0.1:8000/wave/Rocketeer/100 #[get("//")] fn wave(name: &str, age: u8) -> String { format!("👋 Hello, {} year old named {}!", age, name) } // Note: without the `..` in `opt..`, we'd need to pass `opt.emoji`, `opt.name`. // // Try visiting: // http://127.0.0.1:8000/?emoji // http://127.0.0.1:8000/?name=Rocketeer // http://127.0.0.1:8000/?lang=ру // http://127.0.0.1:8000/?lang=ру&emoji // http://127.0.0.1:8000/?emoji&lang=en // http://127.0.0.1:8000/?name=Rocketeer&lang=en // http://127.0.0.1:8000/?emoji&name=Rocketeer // http://127.0.0.1:8000/?name=Rocketeer&lang=en&emoji // http://127.0.0.1:8000/?lang=ru&emoji&name=Rocketeer #[get("/?&")] fn hello(lang: Option, opt: Options<'_>) -> String { let mut greeting = String::new(); if opt.emoji { greeting.push_str("👋 "); } match lang { Some(Lang::Russian) => greeting.push_str("Привет"), Some(Lang::English) => greeting.push_str("Hello"), None => greeting.push_str("Hi"), } if let Some(name) = opt.name { greeting.push_str(", "); greeting.push_str(name); } greeting.push('!'); greeting } #[launch] fn rocket() -> _ { rocket::build() .mount("/", routes![hello]) .mount("/hello", routes![world, mir]) .mount("/wave", routes![wave]) }