highnoon 0.0.9

minimal web server framework inspired by tide, but built on hyper
Documentation
use highnoon::{App, Json, Request, StatusCode};
use serde_json::{json, Value};

fn make_app() -> App<()> {
    let mut app = App::new(());

    app.at("/greeting").get(|_req| async { "Hello World!" });

    app.at("/reverse").get(|mut req: Request<()>| async move {
        let mut data = req.body_bytes().await?;
        data.reverse();
        Ok(data)
    });

    app.at("/json").get(|mut req: Request<()>| async move {
        let data: Value = req.body_json().await?;
        let greeting = data
            .get("greeting")
            .and_then(|val| val.as_str())
            .map(|s| s.to_owned());
        Ok(Json(greeting))
    });

    app
}

#[tokio::main]
#[test]
pub async fn test_greeting() -> highnoon::Result<()> {
    let tc = make_app().test();

    let mut resp = tc.get("/greeting").send().await?;
    assert_eq!(resp.status(), StatusCode::OK);
    assert_eq!(resp.body_string().await?, "Hello World!");

    Ok(())
}

#[tokio::main]
#[test]
pub async fn test_reverse() -> highnoon::Result<()> {
    let tc = make_app().test();

    let mut resp = tc.get("/reverse").body("Hello World!")?.send().await?;

    assert_eq!(resp.status(), StatusCode::OK);
    assert_eq!(resp.body_string().await?, "!dlroW olleH");

    Ok(())
}

#[tokio::main]
#[test]
pub async fn test_json() -> highnoon::Result<()> {
    let tc = make_app().test();

    let mut resp = tc
        .get("/json")
        .json(json!({
            "greeting": "Hello World!"
        }))?
        .send()
        .await?;

    assert_eq!(resp.status(), StatusCode::OK);
    assert_eq!(resp.body_string().await?, "\"Hello World!\"");

    Ok(())
}

#[tokio::main]
#[test]
pub async fn test_404() -> highnoon::Result<()> {
    let tc = make_app().test();

    let resp = tc.get("/no_such_route").send().await?;

    assert_eq!(resp.status(), StatusCode::NOT_FOUND);

    Ok(())
}

#[tokio::main]
#[test]
pub async fn test_method_not_allowed() -> highnoon::Result<()> {
    let tc = make_app().test();

    let resp = tc.delete("/greeting").send().await?;

    assert_eq!(resp.status(), StatusCode::METHOD_NOT_ALLOWED);

    Ok(())
}