extern crate futures;
extern crate hyper;
extern crate pretty_env_logger;
extern crate radix_router;
use futures::future;
use hyper::rt::{self, Future, Stream};
use hyper::{Body, Request, Response, Server};
use radix_router::router::Params;
use radix_router::router::{BoxFut, Router, Handler};
fn get_echo(_: Request<Body>, _: Params) -> BoxFut {
let response = Response::builder()
.body(Body::from("Try POSTing data to /echo"))
.unwrap();
Box::new(future::ok(response))
}
fn post_echo(req: Request<Body>, _: Params) -> BoxFut {
let response = Response::builder().body(req.into_body()).unwrap();
Box::new(future::ok(response))
}
fn post_echo_uppercase(req: Request<Body>, _: Params) -> BoxFut {
let mapping = req.into_body().map(|chunk| {
chunk
.iter()
.map(|byte| byte.to_ascii_uppercase())
.collect::<Vec<u8>>()
});
let response = Response::builder()
.body(Body::wrap_stream(mapping))
.unwrap();
Box::new(future::ok(response))
}
fn post_echo_reversed(req: Request<Body>, _: Params) -> BoxFut {
let reversed = req.into_body().concat2().map(move |chunk| {
let body = chunk.iter().rev().cloned().collect::<Vec<u8>>();
Response::builder().body(Body::from(body)).unwrap()
});
Box::new(reversed)
}
fn main() {
pretty_env_logger::init();
let addr = ([127, 0, 0, 1], 3000).into();
let some_str = "Some";
let new_service = move || {
let mut router: Router<Handler> = Router::new();
router.get("/", Box::new(get_echo));
router.post("/echo", Box::new(post_echo));
router.post("/echo/uppercase", Box::new(post_echo_uppercase));
router.post("/echo/reversed", Box::new(post_echo_reversed));
router.get("/some", Box::new(move |_, _| -> BoxFut {
Box::new(future::ok(
Response::builder().body(some_str.into()).unwrap(),
))
}));
router.serve_files("/examples/*filepath", "examples");
router
};
let server = Server::bind(&addr)
.serve(new_service)
.map_err(|e| eprintln!("server error: {}", e));
println!("Listening on http://{}", addr);
rt::run(server);
}