Macro krpc::call

source ·
macro_rules! call {
    (@call $connect:ident, $addr:expr, $func:ident()) => { ... };
    (@call $connect:ident, $addr:expr, $func:ident() -> $ret:ty) => { ... };
    (@call $connect:ident, $addr:expr, $func:ident($($arg:expr),+)) => { ... };
    (@call $connect:ident, $addr:expr, $func:ident($($arg:expr),+) -> $ret:ty) => { ... };
    (tcp, $($var:tt)+) => { ... };
    (unix, $($var:tt)+) => { ... };
}
Expand description

RPC调用

  • 第一个参数表示使用的传输协议,可选值tcp:使用tcp通信, unix:使用unix域套接字通信)
  • 第二个参数为通信地址,类型为&str,例如:"127.0.0.1:9000","/tmp/local/unix"
  • 剩下的参数为函数调用,格式如下所示:
    • rpc1(),无参数无返回值
    • rpc2(id:i32),有参数无返回值
    • rpc3()->i32,无参数有返回值
    • rpc4(a:i32,b:bool)->String,既有参数也有返回值
  • 返回值类型为Result<R,Error>,R为返回值类型,当无返回值时R为()

example

let _ = call!(unix, "/tmp/local/unix", test_notargs_and_notret()).await?;
let _ = call!(unix, "/tmp/local/unix", test_notret("hello client")).await?;
let ret = call!(tcp, "127.0.0.1:9000", test_notargs() -> String).await?;
assert_eq!(&ret, "test_notargs called!");
let ret = call!(tcp, "127.0.0.1:9000", test_has_args_and_ret(10000, 1000, 10, true) -> String).await?;
assert_eq!(&ret, "10000 1000 10 true");