diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-08-18 18:32:08 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-08-19 09:42:40 +0200 |
commit | 9132dd7038e3ba2d996d7b81afec1320a1772ec0 (patch) | |
tree | 6361f38548f43fba1d8fb7ca62624d01eb490678 |
Initial import
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Cargo.toml | 12 | ||||
-rw-r--r-- | src/backend.rs | 1 | ||||
-rw-r--r-- | src/frontend.rs | 87 | ||||
-rw-r--r-- | src/main.rs | 24 |
5 files changed, 126 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..dd93aed --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "water-levels" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +actix-web = "3.3" +env_logger = "0.9" +maud = { version = "0.22", features = ["actix-web"] } +serde = "1" diff --git a/src/backend.rs b/src/backend.rs new file mode 100644 index 0000000..ffdd0d2 --- /dev/null +++ b/src/backend.rs @@ -0,0 +1 @@ +// Empty for now diff --git a/src/frontend.rs b/src/frontend.rs new file mode 100644 index 0000000..1c1075e --- /dev/null +++ b/src/frontend.rs @@ -0,0 +1,87 @@ +use actix_web::Result; +use actix_web::get; +use actix_web::post; +use actix_web::web; + +#[get("/")] +pub async fn index() -> Result<maud::Markup> { + Ok(maud::html! { + html { + body { + h1 { "Hello World!" } + + form action="/make_landscape" method="post" { + label { "Elements" } + input type="number" name="elements" checked; + + input type="submit"; + } + } + } + }) +} + + +#[derive(serde::Deserialize)] +pub struct LandscapeSize { + elements: usize, +} + +#[post("/make_landscape")] +pub async fn make_landscape(form: web::Form<LandscapeSize>) -> Result<maud::Markup> { + if form.elements > 100 { + return Ok(maud::html! { + html { + body { + p { "For runtime reasons, this application only supports landscapes up to 100 elements" } + } + } + }) + } + + Ok(maud::html! { + html { + body { + h1 { "Hello World!" } + + p { "Please fill in the landscape values" } + form action="/calculate" method="post" { + @for _n in 0..form.elements { + p { + input type="number" name="levels[]" checked; + } + } + + input type="number" name="hours" checked; + label for="hours" { "Hours of Rain" } + + input type="submit"; + } + } + } + }) +} + +#[derive(serde::Deserialize)] +pub struct Landscape { + levels: Vec<usize>, + hours: usize, +} + +#[post("/calculate")] +pub async fn calculate(form: web::Form<Landscape>) -> Result<maud::Markup> { + Ok(maud::html! { + html { + body { + h1 { "Landscape!" } + + p { "Filling in " (form.hours) " hours" } + + @for value in &form.levels { + p { (value) } + } + } + } + }) +} + diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..689099d --- /dev/null +++ b/src/main.rs @@ -0,0 +1,24 @@ +use actix_web::App; +use actix_web::HttpServer; +use actix_web::middleware::Logger; + +mod frontend; +mod backend; + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + std::env::set_var("RUST_LOG", "actix_web=info"); + env_logger::init(); + + HttpServer::new(|| { + App::new() + .wrap(Logger::default()) + .wrap(Logger::new("%a %{User-Agent}i")) + .service(crate::frontend::index) + .service(crate::frontend::make_landscape) + .service(crate::frontend::calculate) + }) + .bind(("127.0.0.1", 8080))? + .run() + .await +} |