@@ -11,7 +11,21 @@ use router::{Match, Router};
11
11
12
12
#[ derive( Default ) ]
13
13
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
+ }
15
29
}
16
30
17
31
#[ derive( Debug ) ]
@@ -29,7 +43,7 @@ impl RouteBuilder {
29
43
& ' a self ,
30
44
method : & Method ,
31
45
path : & str ,
32
- ) -> Result < Match < & ' a Box < dyn Handler > > , RouterError > {
46
+ ) -> Result < Match < & WrappedHandler > , RouterError > {
33
47
match self . routers . get ( method) {
34
48
Some ( router) => router. recognize ( path) ,
35
49
None => Err ( format ! ( "No router found for {:?}" , method) ) ,
@@ -40,36 +54,60 @@ impl RouteBuilder {
40
54
pub fn map < ' a , H : Handler > (
41
55
& ' a mut self ,
42
56
method : Method ,
43
- pattern : & str ,
57
+ pattern : & ' static str ,
44
58
handler : H ,
45
59
) -> & ' a mut RouteBuilder {
46
60
{
47
61
let router = match self . routers . entry ( method) {
48
62
Entry :: Occupied ( e) => e. into_mut ( ) ,
49
63
Entry :: Vacant ( e) => e. insert ( Router :: new ( ) ) ,
50
64
} ;
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) ;
52
70
}
53
71
self
54
72
}
55
73
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 {
57
79
self . map ( Method :: GET , pattern, handler)
58
80
}
59
81
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 {
61
87
self . map ( Method :: POST , pattern, handler)
62
88
}
63
89
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 {
65
95
self . map ( Method :: PUT , pattern, handler)
66
96
}
67
97
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 {
69
103
self . map ( Method :: DELETE , pattern, handler)
70
104
}
71
105
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 {
73
111
self . map ( Method :: HEAD , pattern, handler)
74
112
}
75
113
}
@@ -88,6 +126,7 @@ impl conduit::Handler for RouteBuilder {
88
126
89
127
{
90
128
let extensions = request. mut_extensions ( ) ;
129
+ extensions. insert ( m. handler . pattern ) ;
91
130
extensions. insert ( m. params . clone ( ) ) ;
92
131
}
93
132
@@ -130,7 +169,7 @@ mod tests {
130
169
use std:: io;
131
170
use std:: net:: SocketAddr ;
132
171
133
- use { RequestParams , RouteBuilder } ;
172
+ use { RequestParams , RouteBuilder , RoutePattern } ;
134
173
135
174
use self :: conduit_test:: ResponseExt ;
136
175
use conduit:: {
@@ -206,7 +245,7 @@ mod tests {
206
245
let res = router. call ( & mut req) . expect ( "No response" ) ;
207
246
208
247
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 " [ ..] ) ;
210
249
}
211
250
212
251
#[ test]
@@ -216,7 +255,7 @@ mod tests {
216
255
let res = router. call ( & mut req) . expect ( "No response" ) ;
217
256
218
257
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 " [ ..] ) ;
220
259
}
221
260
222
261
#[ test]
@@ -237,6 +276,13 @@ mod tests {
237
276
let mut res = vec ! [ ] ;
238
277
res. push ( req. params ( ) [ "id" ] . clone ( ) ) ;
239
278
res. push ( format ! ( "{:?}" , req. method( ) ) ) ;
279
+ res. push (
280
+ req. extensions ( )
281
+ . find :: < RoutePattern > ( )
282
+ . unwrap ( )
283
+ . 0
284
+ . to_string ( ) ,
285
+ ) ;
240
286
241
287
let bytes = res. join ( ", " ) . into_bytes ( ) ;
242
288
Response :: builder ( ) . body ( Body :: from_vec ( bytes) )
0 commit comments