@@ -2,7 +2,7 @@ extern crate "route-recognizer" as router;
2
2
extern crate conduit;
3
3
4
4
use std:: collections:: hash_map:: { HashMap , Entry } ;
5
- use std:: fmt :: Show ;
5
+ use std:: error :: Error ;
6
6
7
7
use router:: { Router , Match } ;
8
8
use conduit:: { Method , Handler , Request , Response } ;
@@ -11,28 +11,31 @@ pub struct RouteBuilder {
11
11
routers : HashMap < Method , Router < Box < Handler + Send + Sync > > >
12
12
}
13
13
14
+ pub struct RouterError ( String ) ;
15
+
14
16
impl RouteBuilder {
15
17
pub fn new ( ) -> RouteBuilder {
16
18
RouteBuilder { routers : HashMap :: new ( ) }
17
19
}
18
20
19
21
pub fn recognize < ' a > ( & ' a self , method : & Method , path : & str )
20
- -> Result < Match < & ' a Box < Handler + Send + Sync > > , String >
22
+ -> Result < Match < & ' a Box < Handler + Send + Sync > > ,
23
+ RouterError >
21
24
{
22
25
match self . routers . get ( method) {
23
- None => Err ( format ! ( "No router found for {}" , method ) ) ,
24
- Some ( router ) => router . recognize ( path )
25
- }
26
+ Some ( router ) => router. recognize ( path ) ,
27
+ None => Err ( format ! ( "No router found for {:?}" , method ) ) ,
28
+ } . map_err ( RouterError )
26
29
}
27
30
28
31
pub fn map < ' a , H : Handler > ( & ' a mut self , method : Method , pattern : & str ,
29
32
handler : H ) -> & ' a mut RouteBuilder {
30
33
{
31
- let router = match self . routers . entry ( & method) {
34
+ let router = match self . routers . entry ( method) {
32
35
Entry :: Occupied ( e) => e. into_mut ( ) ,
33
36
Entry :: Vacant ( e) => e. insert ( Router :: new ( ) ) ,
34
37
} ;
35
- router. add ( pattern, box handler as Box < Handler + Send + Sync > ) ;
38
+ router. add ( pattern, Box :: new ( handler ) ) ;
36
39
}
37
40
self
38
41
}
@@ -64,14 +67,14 @@ impl RouteBuilder {
64
67
}
65
68
66
69
impl conduit:: Handler for RouteBuilder {
67
- fn call ( & self , request : & mut Request ) -> Result < Response , Box < Show + ' static > > {
70
+ fn call ( & self , request : & mut Request ) -> Result < Response , Box < Error > > {
68
71
let m = {
69
72
let method = request. method ( ) ;
70
73
let path = request. path ( ) ;
71
74
72
75
match self . recognize ( & method, path) {
73
76
Ok ( m) => m,
74
- Err ( e) => return Err ( box e as Box < Show > )
77
+ Err ( e) => return Err ( Box :: new ( e ) as Box < Error > )
75
78
}
76
79
} ;
77
80
@@ -84,6 +87,10 @@ impl conduit::Handler for RouteBuilder {
84
87
}
85
88
}
86
89
90
+ impl Error for RouterError {
91
+ fn description ( & self ) -> & str { self . 0 . as_slice ( ) }
92
+ }
93
+
87
94
pub trait RequestParams < ' a > {
88
95
fn params ( self ) -> & ' a router:: Params ;
89
96
}
@@ -102,9 +109,10 @@ impl<'a> RequestParams<'a> for &'a (Request + 'a) {
102
109
#[ cfg( test) ]
103
110
mod tests {
104
111
extern crate semver;
105
- use std:: io:: net:: ip:: IpAddr ;
106
112
use std:: collections:: HashMap ;
113
+ use std:: error:: Error ;
107
114
use std:: io:: MemReader ;
115
+ use std:: io:: net:: ip:: IpAddr ;
108
116
109
117
use { RouteBuilder , RequestParams } ;
110
118
@@ -139,7 +147,7 @@ mod tests {
139
147
}
140
148
fn query_string < ' a > ( & ' a self ) -> Option < & ' a str > { unimplemented ! ( ) }
141
149
fn remote_ip ( & self ) -> IpAddr { unimplemented ! ( ) }
142
- fn content_length ( & self ) -> Option < uint > { unimplemented ! ( ) }
150
+ fn content_length ( & self ) -> Option < u64 > { unimplemented ! ( ) }
143
151
fn headers < ' a > ( & ' a self ) -> & ' a Headers { unimplemented ! ( ) }
144
152
fn body < ' a > ( & ' a mut self ) -> & ' a mut Reader { unimplemented ! ( ) }
145
153
fn extensions < ' a > ( & ' a self ) -> & ' a Extensions {
@@ -184,15 +192,16 @@ mod tests {
184
192
router
185
193
}
186
194
187
- fn test_handler ( req : & mut conduit:: Request ) -> Result < conduit:: Response , ( ) > {
195
+ fn test_handler ( req : & mut conduit:: Request )
196
+ -> Result < conduit:: Response , Box < Error > > {
188
197
let mut res = vec ! ( ) ;
189
198
res. push ( req. params ( ) [ "id" ] . clone ( ) ) ;
190
- res. push ( format ! ( "{}" , req. method( ) ) ) ;
199
+ res. push ( format ! ( "{:? }" , req. method( ) ) ) ;
191
200
192
201
Ok ( conduit:: Response {
193
202
status : ( 200 , "OK" ) ,
194
203
headers : HashMap :: new ( ) ,
195
- body : box MemReader :: new ( res. connect ( ", " ) . into_bytes ( ) )
204
+ body : Box :: new ( MemReader :: new ( res. connect ( ", " ) . into_bytes ( ) ) )
196
205
} )
197
206
}
198
207
}
0 commit comments