krpc_macro/
lib.rs

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 &param.method_name[..] == stringify!($method) {
16                    let req = &param.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}