Macro define Copy item path Source macro_rules! define {
(tcp, $($var:tt)+) => { ... };
(unix, $($var:tt)+) => { ... };
}Expand description § 定义RPC Client的新类型
第一个参数表示使用的传输协议,可选值tcp :使用tcp通信, unix :使用unix域套接字通信)
第二个参数为新类型的名称,例如MyStruct
剩下的参数为新类型的方法声明(可以声明多个),支持格式如下:
fn rpc1(),无参数无返回值声明
fn rpc2(id:i32),有参数无返回值声明
fn rpc3()->i32,无参数有返回值声明
fn rpc4(a:i32,b:bool)->String,既有参数也有返回值声明
sub onOpen(topic:TopicType,f:impl FnMut(ArgType)),订阅主题通过lambda函数回调处理,其中TopicType必须实现Deref<Target = str> ,ArgType需实现serde::de::Deserialize ,另外lambda函数返回值类型为**()**
sub onClose(topic:TopicType,var:&mut V),订阅主题通过SubcribeCallback trait处理,其中TopicType必须实现Deref<Target = str> ,var类型必须为**&mut**,V需要实现SubcribeCallback ,T实现serde::de::Deserialize ,T即为订阅的数据类型
注意:
此宏会默认一个pub async fn new(path:&str) -> std::io::Result的方法,用以创建新定义的类型
此宏会默认一个pub async fn heartbeat(&self) -> Result<(), Error>的方法,用以检测服务端是否存在
不需要在方法参数表第一个参数指明self,此宏会自己生成
当同时存在fn与sub方法声明时,以fn 开头的所有方法声明必须在以sub 的前面,即先fn声明在前,sub声明在后
§ example
struct MySub;
impl SubcribeCallback<(String, i32)> for MySub {
fn callback(&mut self , data: (String, i32)) -> bool {
false
}
}
只定义rpc方法
define! (unix, Test1,
fn rpc1(),
fn rpc2(id:i32),
fn rpc3()->i32,
fn rpc4(a:i32,b:bool)->String
);
只定义订阅方法
define! (unix, Test2,
sub onOpen(topic:& 'static str, f:impl FnMut((String,i32))),
sub onClose(topic:& 'static str, var:&mut MySub)
);
定义rpc方法和订阅方法
define! (unix, Test,
fn rpc1(),
fn rpc2(id:i32),
fn rpc3()->i32,
fn rpc4(a:i32,b:bool)->String,
sub onOpen(topic:& 'static str, f:impl FnMut((String,i32))),
sub onClose(topic:& 'static str, var:&mut MySub)
);
struct Test(T);
impl Test {
pub async fn new(path:& str) -> std::io::Result<Self > {...} pub async fn heartbeat(& self ) -> Result <(), Error> {...} pub async fn rpc1(& self ) -> Result <(), Error> {...}
pub async fn rpc2(& self , id:i32) -> Result <(), Error> {...}
pub async fn rpc3(& self ) -> Result <i32, Error> {...}
pub async fn rpc4(& self , a:i32, b:bool) -> Result <String, Error> {...}
pub async fn onOpen(topic:& 'static str, f:impl FnMut(String,i32)) -> Result <(), Error> {...} pub async fn onClose(topic:& 'static str, var:&mut MySub) -> Result <(), Error> {...} }