1#[macro_export]
2macro_rules! krpc_server {
3 (
4 $package:expr,
5 $name:ident,
6 $version:expr,
7 $(async fn $method:ident (&$self:ident $(,$req:ident : $reqType:ty)* ) -> Result<$resType:ty> { $($code:tt)* })*) => {
8 impl $name {
9 $(
10 #[allow(non_snake_case)]
11 async fn $method (&$self $(,$req : $reqType)* ) -> Result<$resType,krpc_common::RpcError> { $($code)* }
12 )*
13
14 async fn prv_invoke (&self, mut param : krpc_common::KrpcMsg) -> krpc_common::KrpcMsg {
15 $(if ¶m.method_name[..] == stringify!($method) {
16 let req = ¶m.req;
17 let mut idx = 0;
18 $(
19 let result : Result<$reqType,_> = serde_json::from_slice(req[idx].as_bytes());
20 if let Err(err) = result {
21 param.res = Err(krpc_common::RpcError::Server(err.to_string()));
22 return param;
23 }
24 let $req : $reqType = serde_json::from_slice(req[idx].as_bytes()).unwrap();
25 idx += 1;
26 )*
27 let res = self.$method(
28 $(
29 $req,
30 )*
31 ).await;
32 param.res = match res {
33 Ok(res) => {
34 let res = serde_json::to_string(&res);
35 match res {
36 Ok(res) => Ok(res),
37 Err(err) => Err(krpc_common::RpcError::Server(err.to_string()))
38 }
39 },
40 Err(info) => Err(info)
41 };
42 return param;
43 })*
44 param.res = Err(krpc_common::RpcError::Server(format!("not find method by {}",param.method_name)));
45 return param;
46 }
47 }
48 impl krpc_common::RpcServer for $name {
49 fn invoke (&self, param : krpc_common::KrpcMsg) -> krpc_common::KrpcFuture<krpc_common::KrpcMsg> {
50 let rpc = self.clone();
51 Box::pin(async move {rpc.prv_invoke(param).await})
52 }
53 fn get_info(&self) -> (&str , &str , Option<&str> , Vec<String>) {
54 let mut methods = vec![];
55 $(
56 methods.push(stringify!($method).to_string());
57 )*
58 ($package ,stringify!($name) , $version ,methods)
59 }
60 }
61 }
62}
63
64#[macro_export]
65macro_rules! krpc_client {
66 (
67 $cli:ident,
68 $package:expr,
69 $name:ident,
70 $version:expr,
71 $(async fn $method:ident (&$self:ident $(,$req:ident : $reqType:ty)* ) -> Result<$resType:ty> )*) => {
72 impl $name {
73 $(
74 #[allow(non_snake_case)]
75 async fn $method (&$self $(,$req : $reqType)*) -> Result<$resType,krpc_common::RpcError> {
76 let mut req_vec : Vec<String> = vec![];
77 $(
78 let mut res_str = serde_json::to_string(&$req);
79 if let Err(err) = res_str {
80 return Err(krpc_common::RpcError::Client(err.to_string()));
81 }
82 req_vec.push(res_str.unwrap());
83 )*
84 let version : Option<&str> = $version;
85 let msg = krpc_common::KrpcMsg::new(
86 krpc_common::get_uuid(),
87 version.map(|e|e.to_string()),
88 $package.to_owned() + "." + stringify!($name),
89 stringify!($method).to_string(),
90 req_vec,
91 Err(krpc_common::RpcError::Null)
92 );
93 let res : Result<$resType,krpc_common::RpcError> = $cli.invoke::<$resType>(msg).await;
94 return res;
95 }
96 )*
97 }
98 }
99}