use tokio::net::TcpListener;
use tokio::prelude::*;
use peta::{status, HttpReader, Request, Response, ResponseFut, Router};
use std::time::{Duration, Instant};
use tokio::timer::Delay;
fn home(req: Request) -> ResponseFut {
let mut res = Response::new();
res.status(status::OK);
res.body_str(req.uri().path());
Box::new(futures::future::ok(res))
}
fn delay(req: Request) -> ResponseFut {
let when = Instant::now() + Duration::from_millis(2000);
let delay = Delay::new(when)
.map_err(|e| panic!("Delay errored; err={:?}", e))
.and_then(move |_| {
let mut res = Response::new();
res.status(status::OK);
res.body_str("Hello world!");
Ok(res)
});
Box::new(delay)
}
fn hello_world(req: Request) -> ResponseFut {
let mut res = Response::new();
res.status(status::OK);
res.body_str("Hello world!");
Box::new(futures::future::ok(res))
}
fn not_found(req: Request) -> ResponseFut {
let mut res = Response::new();
res.status(status::OK);
res.body_str("Did not found page");
Box::new(futures::future::ok(res))
}
fn main() {
let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap();
let addr = "127.0.0.1:3000".parse().unwrap();
let listener = TcpListener::bind(&addr).expect("unable to bind TCP listener");
let mut router = Router::new();
router.get("/hello", hello_world);
router.get("/home", home);
router.get("/delay", delay);
router.get("/delay/*", home);
router.get("/hello/:world/", hello_world);
router.get("/*", hello_world);
router.add_default(not_found);
let router = router.build();
let server = listener
.incoming()
.map_err(|e| eprintln!("accept failed = {:?}", e))
.for_each(move |sock| {
let (read, write) = sock.split();
let router = router.clone();
let reader = HttpReader::new(read)
.map_err(|e| println!("Global Error is: {}", e))
.fold(write, move |writer, req| {
router
.find(req)
.and_then(|rsp| rsp.write(writer).map_err(|e| println!("Error: {}", e)))
})
.map(|_| ());
tokio::runtime::current_thread::spawn(reader);
Ok(())
});
runtime.spawn(server);
runtime.run().unwrap();
}