1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/// Create and populate a router.
///
/// ```ignore
/// let router = router!(get  "/"       => index,
///                      get  "/:query" => queryHandler,
///                      post "/"       => postHandler);
/// ```
///
/// Is equivalent to:
///
/// ```ignore
///    let mut router = Router::new();
///    router.get("/", index);
///    router.get("/:query", queryHandler);
///    router.post("/", postHandler);
/// ```
///
/// The method name must be lowercase, supported methods:
///
/// `get`, `post`, `put`, `delete`, `head`, `patch`, `options`.
#[macro_export]
macro_rules! router {
    ($($method:ident $glob:expr => $handler:expr),+) => ({
        let mut router = $crate::Router::new();
        $(router.$method($glob, $handler);)*
        router
    });
}

#[cfg(test)]
mod tests {
    use iron::{Response, Request, IronResult};

    //simple test to check that all methods expand without error
    #[test]
    fn methods() {
        fn handler(_: &mut Request) -> IronResult<Response> {Ok(Response::new())}
        let _ = router!(get     "/foo" => handler,
                        post    "/bar/" => handler,
                        put     "/bar/baz" => handler,
                        delete  "/bar/baz" => handler,
                        head    "/foo" => handler,
                        patch   "/bar/baz" => handler,
                        options "/foo" => handler);
    }
}