lr -> pr
This commit is contained in:
10
pr/ch2/iron-gcd/Cargo.toml
Normal file
10
pr/ch2/iron-gcd/Cargo.toml
Normal file
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "iron-gcd"
|
||||
version = "0.1.0"
|
||||
authors = ["Kyle Isom <kyle@imap.cc>"]
|
||||
|
||||
[dependencies]
|
||||
iron = "0.5.1"
|
||||
mime = "0.2.3"
|
||||
router = "0.5.1"
|
||||
urlencoded = "0.5.0"
|
||||
96
pr/ch2/iron-gcd/src/main.rs
Normal file
96
pr/ch2/iron-gcd/src/main.rs
Normal file
@@ -0,0 +1,96 @@
|
||||
extern crate iron;
|
||||
extern crate router;
|
||||
extern crate urlencoded;
|
||||
#[macro_use] extern crate mime;
|
||||
|
||||
use std::str::FromStr;
|
||||
use urlencoded::UrlEncodedBody;
|
||||
|
||||
use iron::prelude::*;
|
||||
use iron::status;
|
||||
use router::Router;
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut router = Router::new();
|
||||
|
||||
router.get("/", get_form, "root");
|
||||
router.post("/gcd", post_gcd, "gcd");
|
||||
|
||||
println!("Serving on http://localhost:3000...");
|
||||
Iron::new(router).http("localhost:3000").unwrap();
|
||||
}
|
||||
|
||||
fn get_form(_request: &mut Request) -> IronResult<Response> {
|
||||
let mut response = Response::new();
|
||||
|
||||
response.set_mut(status::Ok);
|
||||
response.set_mut(mime!(Text/Html; Charset=Utf8));
|
||||
response.set_mut(r#"
|
||||
<title>GCD calculator</title>
|
||||
<form action="/gcd" method="post">
|
||||
<input type="text" name="n" />
|
||||
<input type="text" name="n" />
|
||||
<button type="submit">Compute GCD</button>
|
||||
</form>
|
||||
"#);
|
||||
|
||||
Ok(response)
|
||||
}
|
||||
|
||||
fn post_gcd(request: &mut Request) -> IronResult<Response> {
|
||||
let mut response = Response::new();
|
||||
|
||||
let form_data = match request.get_ref::<UrlEncodedBody>() {
|
||||
Err(e) => {
|
||||
response.set_mut(status::BadRequest);
|
||||
response.set_mut(format!("Error parsing form data: {:?}\n", e));
|
||||
return Ok(response);
|
||||
}
|
||||
Ok(map) => map
|
||||
};
|
||||
|
||||
let unparsed_numbers = match form_data.get("n") {
|
||||
None => {
|
||||
response.set_mut(status::BadRequest);
|
||||
response.set_mut(format!("Form has no 'n' parameters!\n"));
|
||||
return Ok(response);
|
||||
}
|
||||
Some(nums) => nums
|
||||
};
|
||||
|
||||
let mut numbers = Vec::new();
|
||||
for unparsed in unparsed_numbers {
|
||||
match u64::from_str(&unparsed) {
|
||||
Err(_) => {
|
||||
response.set_mut(status::BadRequest);
|
||||
response.set_mut(format!("Value for 'n' parameter isn't a number {:?}\n", unparsed));
|
||||
return Ok(response);
|
||||
}
|
||||
Ok(n) => { numbers.push(n); }
|
||||
}
|
||||
}
|
||||
|
||||
let mut d = numbers[0];
|
||||
for m in &numbers[1..] {
|
||||
d = gcd(d, *m);
|
||||
}
|
||||
|
||||
response.set_mut(status::Ok);
|
||||
response.set_mut(mime!(Text/Html; Charset=Utf8));
|
||||
response.set_mut(format!("The GCD of {:?} is {}.\n", numbers, d));
|
||||
|
||||
Ok(response)
|
||||
}
|
||||
Reference in New Issue
Block a user