Add actix-gcd example, from the tour.

pull/13/head
Jim Blandy 3 years ago
parent 64472e49a7
commit 7f7597a656

@ -15,8 +15,8 @@ terms of the MIT license. See [LICENSE-MIT](LICENSE-MIT) for details.
- The `gcd` directory holds the command-line program for computing the greatest
common denominator of a list of numbers.
- The `iron-gcd` directory holds the code for the simple web service,
implemented using the [`iron`] framework, that computes greatest common
- The `actix-gcd` directory holds the code for the simple web service,
implemented using the [`actix-web`] framework, that computes greatest common
denominators.
- The Mandelbrot plotting program has its own repository, at

@ -0,0 +1,2 @@
/target/

1759
actix-gcd/Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,12 @@
[package]
name = "actix-gcd"
version = "0.1.0"
authors = ["You <you@example.com>"]
edition = "2018"
# See more keys and their definitions at
# https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
actix-web = "1.0.8"
serde = { version = "1.0", features = ["derive"] }

@ -0,0 +1,66 @@
use actix_web::{web, App, HttpResponse, HttpServer};
fn main() {
let server = HttpServer::new(|| {
App::new()
.route("/", web::get().to(get_index))
.route("/gcd", web::post().to(post_gcd))
});
println!("Serving on http://localhost:3000...");
server
.bind("127.0.0.1:3000").expect("error binding server to address")
.run().expect("error running server");
}
fn get_index() -> HttpResponse {
HttpResponse::Ok()
.content_type("text/html")
.body(
r#"
<title>GCD Calculator</title>
<form action="/gcd" method="post">
<input type="text" name="n"/>
<input type="text" name="m"/>
<button type="submit">Compute GCD</button>
</form>
"#,
)
}
use serde::Deserialize;
#[derive(Deserialize)]
struct GcdParameters {
n: u64,
m: u64,
}
fn post_gcd(form: web::Form<GcdParameters>) -> HttpResponse {
if form.n == 0 || form.m == 0 {
return HttpResponse::BadRequest()
.content_type("text/html")
.body("Computing the GCD with zero is boring.");
}
let response =
format!("The greatest common divisor of the numbers {} and {} \
is <b>{}</b>\n",
form.n, form.m, gcd(form.n, form.m));
HttpResponse::Ok()
.content_type("text/html")
.body(response)
}
fn gcd(mut n: u64, mut m: u64) -> u64 {
assert!(n != 0 && m != 0);
while m != 0 {
if m < n {
let t = m;
m = n;
n = t;
}
m = m % n;
}
n
}
Loading…
Cancel
Save