mirror of
https://github.com/coollabsio/coolify-examples.git
synced 2026-02-18 13:28:57 +00:00
rust example
This commit is contained in:
1
rust/.gitignore
vendored
Normal file
1
rust/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
target/*
|
||||
1551
rust/Cargo.lock
generated
Normal file
1551
rust/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
8
rust/Cargo.toml
Normal file
8
rust/Cargo.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "hello"
|
||||
version = "0.0.0"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
rocket = "0.5.1"
|
||||
81
rust/src/main.rs
Normal file
81
rust/src/main.rs
Normal file
@@ -0,0 +1,81 @@
|
||||
#[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("/<name>/<age>")]
|
||||
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("/?<lang>&<opt..>")]
|
||||
fn hello(lang: Option<Lang>, 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])
|
||||
}
|
||||
71
rust/src/tests.rs
Normal file
71
rust/src/tests.rs
Normal file
@@ -0,0 +1,71 @@
|
||||
use rocket::local::blocking::Client;
|
||||
use rocket::http::{RawStr, Status};
|
||||
|
||||
#[test]
|
||||
fn hello() {
|
||||
let langs = &["", "ru", "%D1%80%D1%83", "en", "unknown"];
|
||||
let ex_lang = &["Hi", "Привет", "Привет", "Hello", "Hi"];
|
||||
|
||||
let emojis = &["", "on", "true", "false", "no", "yes", "off"];
|
||||
let ex_emoji = &["", "👋 ", "👋 ", "", "", "👋 ", ""];
|
||||
|
||||
let names = &["", "Bob", "Bob+Smith"];
|
||||
let ex_name = &["!", ", Bob!", ", Bob Smith!"];
|
||||
|
||||
let client = Client::tracked(super::rocket()).unwrap();
|
||||
for n in 0..(langs.len() * emojis.len() * names.len()) {
|
||||
let i = n / (emojis.len() * names.len());
|
||||
let j = n % (emojis.len() * names.len()) / names.len();
|
||||
let k = n % (emojis.len() * names.len()) % names.len();
|
||||
|
||||
let (lang, ex_lang) = (langs[i], ex_lang[i]);
|
||||
let (emoji, ex_emoji) = (emojis[j], ex_emoji[j]);
|
||||
let (name, ex_name) = (names[k], ex_name[k]);
|
||||
let expected = format!("{}{}{}", ex_emoji, ex_lang, ex_name);
|
||||
|
||||
let q = |name, s: &str| match s.is_empty() {
|
||||
true => "".into(),
|
||||
false => format!("&{}={}", name, s)
|
||||
};
|
||||
|
||||
let uri = format!("/?{}{}{}", q("lang", lang), q("emoji", emoji), q("name", name));
|
||||
let response = client.get(uri).dispatch();
|
||||
assert_eq!(response.into_string().unwrap(), expected);
|
||||
|
||||
let uri = format!("/?{}{}{}", q("emoji", emoji), q("name", name), q("lang", lang));
|
||||
let response = client.get(uri).dispatch();
|
||||
assert_eq!(response.into_string().unwrap(), expected);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hello_world() {
|
||||
let client = Client::tracked(super::rocket()).unwrap();
|
||||
let response = client.get("/hello/world").dispatch();
|
||||
assert_eq!(response.into_string(), Some("Hello, world!".into()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hello_mir() {
|
||||
let client = Client::tracked(super::rocket()).unwrap();
|
||||
let response = client.get("/hello/%D0%BC%D0%B8%D1%80").dispatch();
|
||||
assert_eq!(response.into_string(), Some("Привет, мир!".into()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn wave() {
|
||||
let client = Client::tracked(super::rocket()).unwrap();
|
||||
for &(name, age) in &[("Bob%20Smith", 22), ("Michael", 80), ("A", 0), ("a", 127)] {
|
||||
let uri = format!("/wave/{}/{}", name, age);
|
||||
let real_name = RawStr::new(name).percent_decode_lossy();
|
||||
let expected = format!("👋 Hello, {} year old named {}!", age, real_name);
|
||||
let response = client.get(uri).dispatch();
|
||||
assert_eq!(response.into_string().unwrap(), expected);
|
||||
|
||||
for bad_age in &["1000", "-1", "bird"] {
|
||||
let bad_uri = format!("/wave/{}/{}", name, bad_age);
|
||||
let response = client.get(bad_uri).dispatch();
|
||||
assert_eq!(response.status(), Status::UnprocessableEntity);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user