@@ -4,20 +4,20 @@ use futures::{
4
4
prelude:: * ,
5
5
} ;
6
6
use hyper:: service:: Service ;
7
- use std:: { sync:: Arc , ops:: { Deref , DerefMut } } ;
7
+ use std:: {
8
+ ops:: { Deref , DerefMut } ,
9
+ sync:: Arc ,
10
+ } ;
8
11
9
12
use crate :: {
10
- router:: { Resource , Router } ,
11
- Request ,
12
- extract:: Extract ,
13
- RouteMatch ,
14
- Response ,
15
13
body:: Body ,
16
- Middleware ,
14
+ extract:: Extract ,
15
+ router:: { Resource , Router } ,
16
+ Middleware , Request , Response , RouteMatch ,
17
17
} ;
18
18
19
19
/// The top-level type for setting up a Tide application.
20
- ///
20
+ ///
21
21
/// Apps are equipped with a handle to their own state (`Data`), which is available to all endpoints.
22
22
/// This is a "handle" because it must be `Clone`, and endpoints are invoked with a fresh clone.
23
23
/// They also hold a top-level router.
@@ -57,21 +57,25 @@ impl<Data: Clone + Send + Sync + 'static> App<Data> {
57
57
}
58
58
59
59
/// Start serving the app at the given address.
60
- ///
60
+ ///
61
61
/// Blocks the calling thread indefinitely.
62
62
pub fn serve < A : std:: net:: ToSocketAddrs > ( self , addr : A ) {
63
63
let server: Server < Data > = self . into_server ( ) ;
64
64
65
65
// TODO: be more robust
66
66
let addr = addr. to_socket_addrs ( ) . unwrap ( ) . next ( ) . unwrap ( ) ;
67
67
68
- let server = hyper:: Server :: bind ( & addr) . serve ( move || {
69
- let res: Result < _ , std:: io:: Error > = Ok ( server. clone ( ) ) ;
70
- res
71
- } ) . compat ( ) . map ( |_| {
72
- let res: Result < ( ) , ( ) > = Ok ( ( ) ) ;
73
- res
74
- } ) . compat ( ) ;
68
+ let server = hyper:: Server :: bind ( & addr)
69
+ . serve ( move || {
70
+ let res: Result < _ , std:: io:: Error > = Ok ( server. clone ( ) ) ;
71
+ res
72
+ } )
73
+ . compat ( )
74
+ . map ( |_| {
75
+ let res: Result < ( ) , ( ) > = Ok ( ( ) ) ;
76
+ res
77
+ } )
78
+ . compat ( ) ;
75
79
hyper:: rt:: run ( server) ;
76
80
}
77
81
}
@@ -94,35 +98,41 @@ impl<Data: Clone + Send + Sync + 'static> Service for Server<Data> {
94
98
let router = self . router . clone ( ) ;
95
99
let middleware = self . middleware . clone ( ) ;
96
100
97
- let mut req = req. map ( Body :: from) ;
101
+ let mut req = req. map ( Body :: from) ;
98
102
let path = req. uri ( ) . path ( ) . to_owned ( ) ;
99
103
let method = req. method ( ) . to_owned ( ) ;
100
104
101
- FutureObj :: new ( Box :: new ( async move {
102
- if let Some ( ( endpoint, params) ) = router. route ( & path, & method) {
103
- for m in middleware. iter ( ) {
104
- match await ! ( m. request( & mut data, req, & params) ) {
105
- Ok ( new_req) => req = new_req,
106
- Err ( resp) => return Ok ( resp. map ( Into :: into) ) ,
107
- }
105
+ FutureObj :: new ( Box :: new (
106
+ async move {
107
+ if let Some ( ( endpoint, params) ) = router. route ( & path, & method) {
108
+ for m in middleware. iter ( ) {
109
+ match await ! ( m. request( & mut data, req, & params) ) {
110
+ Ok ( new_req) => req = new_req,
111
+ Err ( resp) => return Ok ( resp. map ( Into :: into) ) ,
112
+ }
113
+ }
114
+
115
+ let ( head, mut resp) = await ! ( endpoint. call( data. clone( ) , req, params) ) ;
116
+
117
+ for m in middleware. iter ( ) {
118
+ resp = await ! ( m. response( & mut data, & head, resp) )
119
+ }
120
+
121
+ Ok ( resp. map ( Into :: into) )
122
+ } else {
123
+ Ok ( http:: Response :: builder ( )
124
+ . status ( http:: status:: StatusCode :: NOT_FOUND )
125
+ . body ( hyper:: Body :: empty ( ) )
126
+ . unwrap ( ) )
108
127
}
109
-
110
- let ( head, mut resp) = await ! ( endpoint. call( data. clone( ) , req, params) ) ;
111
-
112
- for m in middleware. iter ( ) {
113
- resp = await ! ( m. response( & mut data, & head, resp) )
114
- }
115
-
116
- Ok ( resp. map ( Into :: into) )
117
- } else {
118
- Ok ( http:: Response :: builder ( ) . status ( http:: status:: StatusCode :: NOT_FOUND ) . body ( hyper:: Body :: empty ( ) ) . unwrap ( ) )
119
- }
120
- } ) ) . compat ( )
128
+ } ,
129
+ ) )
130
+ . compat ( )
121
131
}
122
132
}
123
133
124
134
/// An extractor for accessing app data.
125
- ///
135
+ ///
126
136
/// Endpoints can use `AppData<T>` to gain a handle to the data (of type `T`) originally injected into their app.
127
137
pub struct AppData < T > ( pub T ) ;
128
138
@@ -140,11 +150,7 @@ impl<T> DerefMut for AppData<T> {
140
150
141
151
impl < T : Clone + Send + ' static > Extract < T > for AppData < T > {
142
152
type Fut = future:: Ready < Result < Self , Response > > ;
143
- fn extract (
144
- data : & mut T ,
145
- req : & mut Request ,
146
- params : & RouteMatch < ' _ > ,
147
- ) -> Self :: Fut {
153
+ fn extract ( data : & mut T , req : & mut Request , params : & RouteMatch < ' _ > ) -> Self :: Fut {
148
154
future:: ok ( AppData ( data. clone ( ) ) )
149
155
}
150
- }
156
+ }
0 commit comments