6
6
//! use serde_json::Value;
7
7
//!
8
8
//! struct ServiceHandler;
9
- //! impl Service for ServiceHandler {
10
- //! fn handle(&self, req : &mut Request) -> Result<Option<Response>> {
9
+ //! impl<T> Service<T> for ServiceHandler {
10
+ //! fn handle(&self, request : &mut Request, context: &Context<T> ) -> Result<Option<Response>> {
11
11
//! let mut response = None;
12
- //! if req .matches("hello") {
13
- //! let params: String = req .deserialize()?;
12
+ //! if request .matches("hello") {
13
+ //! let params: String = request .deserialize()?;
14
14
//! let message = format!("Hello, {}!", params);
15
- //! response = Some((req , Value::String(message)).into());
15
+ //! response = Some((request , Value::String(message)).into());
16
16
//! }
17
17
//! Ok(response)
18
18
//! }
19
19
//! }
20
20
//!
21
21
//! fn main() -> Result<()> {
22
- //! let service: Box<dyn Service> = Box::new(ServiceHandler {});
22
+ //! let service: Box<dyn Service<()> > = Box::new(ServiceHandler {});
23
23
//! let mut request = Request::new(
24
24
//! "hello", Some(Value::String("world".to_string())));
25
25
//! let services = vec![&service];
@@ -174,44 +174,75 @@ pub struct RpcError {
174
174
}
175
175
176
176
/// Trait for services that maybe handle a request.
177
- pub trait Service {
177
+ pub trait Service < T > {
178
178
/// Service implementations are invoked with a request
179
179
/// and should reply with a response if the method name
180
180
/// is one handled by the service.
181
181
///
182
182
/// If the method name for the request is not handled by the service
183
183
/// if should return `None`.
184
- fn handle ( & self , req : & mut Request ) -> Result < Option < Response > > ;
184
+ fn handle ( & self , request : & mut Request , context : & Context < T > ) -> Result < Option < Response > > ;
185
185
}
186
186
187
- /// Call services in order and return the first response message.
188
- ///
189
- /// If no services match the incoming request this will
190
- /// return a `Error::MethodNotFound`.
191
- pub fn handle < ' a > (
192
- services : & ' a Vec < & ' a Box < dyn Service > > ,
193
- request : & mut Request ,
194
- ) -> Result < Response > {
195
- for service in services {
196
- if let Some ( result) = service. handle ( request) ? {
197
- return Ok ( result) ;
187
+ /// Context information passed to service handlers that wraps type `T`.
188
+ #[ derive( Default ) ]
189
+ pub struct Context < T > {
190
+ /// Inner context data.
191
+ pub data : T ,
192
+ }
193
+
194
+ /// Serve requests.
195
+ pub struct Server < ' a , T > {
196
+ /// Services that the server should invoke for every request.
197
+ pub services : & ' a Vec < & ' a Box < dyn Service < T > > > ,
198
+ }
199
+
200
+ impl < ' a , T > Server < ' a , T > {
201
+ /// Call services in order and return the first response message.
202
+ ///
203
+ /// If no services match the incoming request this will
204
+ /// return a `Error::MethodNotFound`.
205
+ pub ( crate ) fn handle (
206
+ & self ,
207
+ request : & mut Request ,
208
+ context : & Context < T > ,
209
+ ) -> Result < Response > {
210
+ for service in self . services {
211
+ if let Some ( result) = service. handle ( request, context) ? {
212
+ return Ok ( result) ;
213
+ }
198
214
}
199
- }
200
215
201
- let err = Error :: MethodNotFound {
202
- name : request. method ( ) . to_string ( ) ,
203
- id : request. id . clone ( ) ,
204
- } ;
216
+ let err = Error :: MethodNotFound {
217
+ name : request. method ( ) . to_string ( ) ,
218
+ id : request. id . clone ( ) ,
219
+ } ;
220
+
221
+ Ok ( ( request, err) . into ( ) )
222
+ }
205
223
206
- Ok ( ( request, err) . into ( ) )
224
+ /// Infallible service handler, errors are automatically converted to responses.
225
+ pub fn serve (
226
+ & self ,
227
+ request : & mut Request ,
228
+ context : & Context < T > ,
229
+ ) -> Response {
230
+ match self . handle ( request, context) {
231
+ Ok ( response) => response,
232
+ Err ( e) => e. into ( ) ,
233
+ }
234
+ }
207
235
}
208
236
209
- /// Infallible service handler, errors are automatically converted to responses .
237
+ /// Create a server and call services with a context of `()` .
210
238
pub fn serve < ' a > (
211
- services : & ' a Vec < & ' a Box < dyn Service > > ,
239
+ services : & ' a Vec < & ' a Box < dyn Service < ( ) > > > ,
212
240
request : & mut Request ,
213
241
) -> Response {
214
- match handle ( services, request) {
242
+ let server = Server { services } ;
243
+ //let data = ();
244
+ let context = Context { data : ( ) } ;
245
+ match server. handle ( request, & context) {
215
246
Ok ( response) => response,
216
247
Err ( e) => e. into ( ) ,
217
248
}
@@ -391,29 +422,29 @@ mod test {
391
422
}
392
423
393
424
struct HelloServiceHandler ;
394
- impl Service for HelloServiceHandler {
395
- fn handle ( & self , req : & mut Request ) -> Result < Option < Response > > {
425
+ impl < T > Service < T > for HelloServiceHandler {
426
+ fn handle ( & self , request : & mut Request , _context : & Context < T > ) -> Result < Option < Response > > {
396
427
let mut response = None ;
397
- if req . matches ( "hello" ) {
398
- let params: String = req . deserialize ( ) ?;
428
+ if request . matches ( "hello" ) {
429
+ let params: String = request . deserialize ( ) ?;
399
430
let message = format ! ( "Hello, {}!" , params) ;
400
- response = Some ( ( req , Value :: String ( message) ) . into ( ) ) ;
431
+ response = Some ( ( request , Value :: String ( message) ) . into ( ) ) ;
401
432
}
402
433
Ok ( response)
403
434
}
404
435
}
405
436
406
437
struct InternalErrorService ;
407
- impl Service for InternalErrorService {
408
- fn handle ( & self , _req : & mut Request ) -> Result < Option < Response > > {
438
+ impl < T > Service < T > for InternalErrorService {
439
+ fn handle ( & self , _request : & mut Request , _context : & Context < T > ) -> Result < Option < Response > > {
409
440
// Must Box the error as it is foreign.
410
441
Err ( Error :: boxed ( MockError :: Internal ( "Mock error" . to_string ( ) ) ) )
411
442
}
412
443
}
413
444
414
445
#[ test]
415
446
fn jsonrpc_service_ok ( ) -> Result < ( ) > {
416
- let service: Box < dyn Service > = Box :: new ( HelloServiceHandler { } ) ;
447
+ let service: Box < dyn Service < ( ) > > = Box :: new ( HelloServiceHandler { } ) ;
417
448
let mut request = Request :: new ( "hello" , Some ( Value :: String ( "world" . to_string ( ) ) ) ) ;
418
449
let services = vec ! [ & service] ;
419
450
let response = serve ( & services, & mut request) ;
@@ -444,7 +475,7 @@ mod test {
444
475
445
476
#[ test]
446
477
fn jsonrpc_service_method_not_found ( ) -> Result < ( ) > {
447
- let service: Box < dyn Service > = Box :: new ( HelloServiceHandler { } ) ;
478
+ let service: Box < dyn Service < ( ) > > = Box :: new ( HelloServiceHandler { } ) ;
448
479
let mut request = Request :: new ( "non-existent" , None ) ;
449
480
let services = vec ! [ & service] ;
450
481
let response = serve ( & services, & mut request) ;
@@ -461,7 +492,7 @@ mod test {
461
492
462
493
#[ test]
463
494
fn jsonrpc_invalid_params ( ) -> Result < ( ) > {
464
- let service: Box < dyn Service > = Box :: new ( HelloServiceHandler { } ) ;
495
+ let service: Box < dyn Service < ( ) > > = Box :: new ( HelloServiceHandler { } ) ;
465
496
let mut request = Request :: new ( "hello" , Some ( Value :: Bool ( true ) ) ) ;
466
497
let services = vec ! [ & service] ;
467
498
let response = serve ( & services, & mut request) ;
@@ -478,7 +509,7 @@ mod test {
478
509
479
510
#[ test]
480
511
fn jsonrpc_internal_error ( ) -> Result < ( ) > {
481
- let service: Box < dyn Service > = Box :: new ( InternalErrorService { } ) ;
512
+ let service: Box < dyn Service < ( ) > > = Box :: new ( InternalErrorService { } ) ;
482
513
let mut request = Request :: new ( "foo" , None ) ;
483
514
let services = vec ! [ & service] ;
484
515
let response = serve ( & services, & mut request) ;
0 commit comments