macro_rules! define {
(tcp, $($var:tt)+) => { ... };
(unix, $($var:tt)+) => { ... };
}Expand description
- 第一个参数表示使用的传输协议,可选值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即为订阅的数据类型
- 注意:
- 不需要在方法参数表第一个参数指明self,此宏会自己生成
- 当同时存在fn与sub方法声明时,以fn开头的所有方法声明必须在以sub的前面,即先fn声明在前,sub声明在后
struct MySub;
impl SubcribeCallback<(String, i32)> for MySub {
fn callback(&mut self, data: (String, i32)) -> bool {
false
}
}
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)
);
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 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> {...} }