Skip to content

Commit 498c9f5

Browse files
authored
Merge pull request #8 from Turbo87/pattern
Expose the matched route pattern in the request extensions
2 parents 302c649 + 53ce697 commit 498c9f5

File tree

1 file changed

+58
-12
lines changed

1 file changed

+58
-12
lines changed

src/lib.rs

+58-12
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,21 @@ use router::{Match, Router};
1111

1212
#[derive(Default)]
1313
pub struct RouteBuilder {
14-
routers: HashMap<Method, Router<Box<dyn Handler>>>,
14+
routers: HashMap<Method, Router<WrappedHandler>>,
15+
}
16+
17+
#[derive(Clone, Copy)]
18+
pub struct RoutePattern(&'static str);
19+
20+
pub struct WrappedHandler {
21+
pattern: RoutePattern,
22+
handler: Box<dyn Handler>,
23+
}
24+
25+
impl conduit::Handler for WrappedHandler {
26+
fn call(&self, request: &mut dyn RequestExt) -> HandlerResult {
27+
self.handler.call(request)
28+
}
1529
}
1630

1731
#[derive(Debug)]
@@ -29,7 +43,7 @@ impl RouteBuilder {
2943
&'a self,
3044
method: &Method,
3145
path: &str,
32-
) -> Result<Match<&'a Box<dyn Handler>>, RouterError> {
46+
) -> Result<Match<&WrappedHandler>, RouterError> {
3347
match self.routers.get(method) {
3448
Some(router) => router.recognize(path),
3549
None => Err(format!("No router found for {:?}", method)),
@@ -40,36 +54,60 @@ impl RouteBuilder {
4054
pub fn map<'a, H: Handler>(
4155
&'a mut self,
4256
method: Method,
43-
pattern: &str,
57+
pattern: &'static str,
4458
handler: H,
4559
) -> &'a mut RouteBuilder {
4660
{
4761
let router = match self.routers.entry(method) {
4862
Entry::Occupied(e) => e.into_mut(),
4963
Entry::Vacant(e) => e.insert(Router::new()),
5064
};
51-
router.add(pattern, Box::new(handler));
65+
let wrapped_handler = WrappedHandler {
66+
pattern: RoutePattern(pattern),
67+
handler: Box::new(handler),
68+
};
69+
router.add(pattern, wrapped_handler);
5270
}
5371
self
5472
}
5573

56-
pub fn get<'a, H: Handler>(&'a mut self, pattern: &str, handler: H) -> &'a mut RouteBuilder {
74+
pub fn get<'a, H: Handler>(
75+
&'a mut self,
76+
pattern: &'static str,
77+
handler: H,
78+
) -> &'a mut RouteBuilder {
5779
self.map(Method::GET, pattern, handler)
5880
}
5981

60-
pub fn post<'a, H: Handler>(&'a mut self, pattern: &str, handler: H) -> &'a mut RouteBuilder {
82+
pub fn post<'a, H: Handler>(
83+
&'a mut self,
84+
pattern: &'static str,
85+
handler: H,
86+
) -> &'a mut RouteBuilder {
6187
self.map(Method::POST, pattern, handler)
6288
}
6389

64-
pub fn put<'a, H: Handler>(&'a mut self, pattern: &str, handler: H) -> &'a mut RouteBuilder {
90+
pub fn put<'a, H: Handler>(
91+
&'a mut self,
92+
pattern: &'static str,
93+
handler: H,
94+
) -> &'a mut RouteBuilder {
6595
self.map(Method::PUT, pattern, handler)
6696
}
6797

68-
pub fn delete<'a, H: Handler>(&'a mut self, pattern: &str, handler: H) -> &'a mut RouteBuilder {
98+
pub fn delete<'a, H: Handler>(
99+
&'a mut self,
100+
pattern: &'static str,
101+
handler: H,
102+
) -> &'a mut RouteBuilder {
69103
self.map(Method::DELETE, pattern, handler)
70104
}
71105

72-
pub fn head<'a, H: Handler>(&'a mut self, pattern: &str, handler: H) -> &'a mut RouteBuilder {
106+
pub fn head<'a, H: Handler>(
107+
&'a mut self,
108+
pattern: &'static str,
109+
handler: H,
110+
) -> &'a mut RouteBuilder {
73111
self.map(Method::HEAD, pattern, handler)
74112
}
75113
}
@@ -88,6 +126,7 @@ impl conduit::Handler for RouteBuilder {
88126

89127
{
90128
let extensions = request.mut_extensions();
129+
extensions.insert(m.handler.pattern);
91130
extensions.insert(m.params.clone());
92131
}
93132

@@ -130,7 +169,7 @@ mod tests {
130169
use std::io;
131170
use std::net::SocketAddr;
132171

133-
use {RequestParams, RouteBuilder};
172+
use {RequestParams, RouteBuilder, RoutePattern};
134173

135174
use self::conduit_test::ResponseExt;
136175
use conduit::{
@@ -206,7 +245,7 @@ mod tests {
206245
let res = router.call(&mut req).expect("No response");
207246

208247
assert_eq!(res.status(), StatusCode::OK);
209-
assert_eq!(*res.into_cow(), b"1, GET"[..]);
248+
assert_eq!(*res.into_cow(), b"1, GET, /posts/:id"[..]);
210249
}
211250

212251
#[test]
@@ -216,7 +255,7 @@ mod tests {
216255
let res = router.call(&mut req).expect("No response");
217256

218257
assert_eq!(res.status(), StatusCode::OK);
219-
assert_eq!(*res.into_cow(), b"10, POST"[..]);
258+
assert_eq!(*res.into_cow(), b"10, POST, /posts/:id"[..]);
220259
}
221260

222261
#[test]
@@ -237,6 +276,13 @@ mod tests {
237276
let mut res = vec![];
238277
res.push(req.params()["id"].clone());
239278
res.push(format!("{:?}", req.method()));
279+
res.push(
280+
req.extensions()
281+
.find::<RoutePattern>()
282+
.unwrap()
283+
.0
284+
.to_string(),
285+
);
240286

241287
let bytes = res.join(", ").into_bytes();
242288
Response::builder().body(Body::from_vec(bytes))

0 commit comments

Comments
 (0)