You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.7 KiB
Rust
70 lines
1.7 KiB
Rust
use actix_web::{web, App, HttpResponse, HttpServer};
|
|
|
|
#[actix_web::main]
|
|
async 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()
|
|
.await
|
|
.expect("error running server");
|
|
}
|
|
|
|
async 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,
|
|
}
|
|
|
|
async 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
|
|
}
|