hyperbole 0.1.2

Reserved for now near-future use.
Documentation
use hyper::Body;
use hyperbole::*;

#[test]
fn test_modify_uri_parser_after_erasure() {
    let _ = Ctx::default()
        .map(|_: R![Body]| r![])
        .map(|_: R![]| r![foo = 40u64])
        .path(uri![bar: u32])
        .map(|_: R![bar: _, foo: _]| r![]);

    let _ = Ctx::default()
        .inject(f![x = 40])
        .map(|_: R![x: _]| r![])
        .path(uri![y: u32])
        .map(|_: R![y: _]| r![]);

    let _ = Ctx::default()
        .map(|_: R![]| r![x = 40])
        .map(|cx: R![x: _]| cx)
        .path(uri![y: u32])
        .map(|_: R![y: _]| r![]);
}

#[tokio::test]
async fn test_basic_uri_parsing() {
    async fn handle(cx: R![x: u32, y: f64]) -> String {
        let (x, y) = cx.into();
        format!("x: {}, y: {}", x, y)
    }

    let app = App::new()
        .context_path(uri![x: u32 / y: f64])
        .get(uri![], handle)
        .collapse()
        .test_client();

    let r = app.get("/44/55").dispatch().await;
    assert_eq!("x: 44, y: 55", r.body());
    assert!(r.status().is_success());

    let r = app.get("/more/fdfdf").dispatch().await;
    assert_eq!(
        r#"failed to parse "more" in uri: invalid digit found in string"#,
        r.body()
    );
    assert!(r.status().is_client_error());

    let r = app.get("/4848484/fdfdf").dispatch().await;
    assert_eq!(
        r#"failed to parse "fdfdf" in uri: invalid float literal"#,
        r.body()
    );
    assert!(r.status().is_client_error());
}

#[tokio::test]
async fn test_route_dispatch_with_ctx_val() {
    async fn handle(cx: R![val: u32]) -> String {
        format!("{}", *cx.head)
    }

    let app = App::new()
        .context()
        .map(|_: R![]| r![val = 0])
        .get(uri!["a"], handle)
        .map(|_: R![val: _]| r![val = 1])
        .get(uri!["b"], handle)
        .map(|_: R![val: _]| r![val = 2])
        .get(uri!["c"], handle)
        .map(|_: R![val: _]| r![val = 3])
        .get(uri!["d"], handle)
        .map(|_: R![val: _]| r![val = 4])
        .get(uri!["e"], handle)
        .map(|_: R![val: _]| r![val = 5])
        .get(uri!["f"], handle)
        .collapse()
        .test_client();

    for (path, val) in &[
        ("/a", 0u32),
        ("/b", 1),
        ("/c", 2),
        ("/d", 3),
        ("/e", 4),
        ("/f", 5),
    ] {
        let r = app.get(path).dispatch().await;

        assert_eq!(&format!("{}", val), r.body());
        assert!(r.status().is_success());
    }
}