frege 0.1.0

A lightweight, async HTTP router for Rust with middleware support
Documentation
use frege::{Handler, Router};
use futures::future::BoxFuture;
use hyper::server::Server;
use hyper::{Body, Request, Response, StatusCode};

fn logging_middleware(req: Request<Body>, next: Handler) -> BoxFuture<'static, Response<Body>> {
    Box::pin(async move {
        println!("Request: {} {}", req.method(), req.uri().path());
        next(req).await
    })
}

fn hello_handler(_req: Request<Body>) -> BoxFuture<'static, Response<Body>> {
    Box::pin(async move {
        Response::builder()
            .status(StatusCode::OK)
            .body(Body::from("Hello, world!"))
            .unwrap()
    })
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut router = Router::new();
    router
        .get("/hello", hello_handler)
        .middlewares(logging_middleware);

    let addr = ([127, 0, 0, 1], 3000).into();
    Server::bind(&addr)
        .serve(hyper::service::make_service_fn(|_| {
            let router = router.clone();
            async move {
                Ok::<_, hyper::Error>(hyper::service::service_fn(move |req| {
                    let router = router.clone();
                    async move { Ok::<_, hyper::Error>(router.handle(req).await) }
                }))
            }
        }))
        .await?;

    Ok(())
}