summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-08-18 18:32:08 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-08-19 09:42:40 +0200
commit9132dd7038e3ba2d996d7b81afec1320a1772ec0 (patch)
tree6361f38548f43fba1d8fb7ca62624d01eb490678
Initial import
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--.gitignore2
-rw-r--r--Cargo.toml12
-rw-r--r--src/backend.rs1
-rw-r--r--src/frontend.rs87
-rw-r--r--src/main.rs24
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
+}