Generates an rpc handler and client helpers based on a trait definition. docs
use easy_jsonrpc;#[easy_jsonrpc::rpc]pubtraitAdder{fnchecked_add(&self,a:isize,b:isize) -> Option<isize>;fnwrapping_add(&self,a:isize,b:isize) -> isize;fnis_some(&self,a:Option<usize>) -> bool{
a.is_some()}fntakes_ref(&self,rf:&isize);}The rpc macro generates
- An implementaion of the Handler trait for &dyn Adder
- A helper module for rpc clients
use easy_jsonrpc::{Handler,MaybeReply};use serde_json::json;structAdderImpl;implAdderforAdderImpl{fnchecked_add(&self,a:isize,b:isize) -> Option<isize>{ a.checked_add(b)}fnwrapping_add(&self,a:isize,b:isize) -> isize{ a.wrapping_add(b)}fntakes_ref(&self,rf:&isize){}}let handler = (&AdderImpl{}as&dynAdder);assert_eq!(
handler.handle_request(json!({"jsonrpc":"2.0","method":"wrapping_add","params":[1,2],"id":1})),MaybeReply::Reply(json!({"jsonrpc":"2.0","result":3,"id":1})));let bind = adder::checked_add(1,2).unwrap();let(call, tracker) = bind.call();let json_response = match handler.handle_request(call.as_request()){MaybeReply::Reply(resp) => resp,MaybeReply::DontReply => panic!(),};letmut response = easy_jsonrpc::Response::from_json_response(json_response).unwrap();assert_eq!(tracker.get_return(&mut response).unwrap(),Some(3));Named arguments are handled for free.
assert_eq!(
handler.handle_request(json!({"jsonrpc":"2.0","method":"wrapping_add","params":{"a":1,"b":2},"id":1})),MaybeReply::Reply(json!({"jsonrpc":"2.0","result":3,"id":1})));Notifications (calls without an id) are handled sanely.
assert_eq!(
handler.handle_request(json!({"jsonrpc":"2.0","method":"wrapping_add","params":[1,1]})),MaybeReply::DontReply);Notification are easy to generate.
let bind = adder::checked_add(0,0).unwrap();let notification = bind.notification().as_request();assert_eq!(handler.handle_request(notification),MaybeReply::DontReply);Batch calls are possible.
use easy_jsonrpc::Call;let bind0 = adder::checked_add(0,0).unwrap();let(call0, tracker0) = bind0.call();let bind1 = adder::checked_add(1,0).unwrap();let(call1, tracker1) = bind1.call();let bind2 = adder::wrapping_add(1,1).unwrap();let(call2, tracker2) = bind2.call();let bind3 = adder::wrapping_add(1,1).unwrap();let call3 = bind3.notification();let json_request = Call::batch_request(&[call0, call1, call2, call3]);let json_response = match handler.handle_request(json_request){MaybeReply::Reply(resp) => resp,MaybeReply::DontReply => panic!(),};letmut response = easy_jsonrpc::Response::from_json_response(json_response).unwrap();assert_eq!(tracker1.get_return(&mut response).unwrap(),Some(1));assert_eq!(tracker0.get_return(&mut response).unwrap(),Some(0));assert_eq!(tracker2.get_return(&mut response).unwrap(),2);