subcribe

Macro subcribe 

Source
macro_rules! subcribe {
    (@sub $connect:ident, $addr:expr, $topic:expr, |$($arg:ident:$argType:ty),+|$body:block) => { ... };
    (@sub $connect:ident, $addr:expr, $topic:expr, $var:expr) => { ... };
    (tcp, $($var:tt)+) => { ... };
    (unix, $($var:tt)+) => { ... };
}
Expand description

§订阅主题

  • 第一个参数表示使用的传输协议,可选值tcp:使用tcp通信, unix:使用unix域套接字通信)
  • 第二个参数为通信地址,类型为&str,例如:"127.0.0.1:9000","/tmp/local/unix"
  • 第三个参数为订阅主题,类型为&str,例如:"onMessage"
  • 第四个参数为订阅数据回调处理,支持两种格式:
    • |id:i32|{}),lambda回调处理,lambda函数可以有多个参数但每个参数需实现serde::de::Deserialize,另外lambda函数返回值类型为(),且lambda函数体需用{}包裹
    • var,var类型为**&mut**,且需要实现SubcribeCallback,T实现serde::de::Deserialize,T即为订阅的数据类型
  • 返回值类型为Result<(),Error>,此订阅会一直运行只有出错时才会返回

§example

//通过lambda进行回调处理
let _ = subcribe!(unix, "/tmp/local/unix", "sub", |s: String, v: i32| {
	println!("({}, {})", s, v);
}).await;

//实现SubcribeCallback trait进行回调处理
struct MySub;
impl SubcribeCallback<(String, i32)> for MySub {
	fn callback(&mut self, data: (String, i32)) -> bool {
		false
	}
}

let mut sub = MySub;
let _ = subcribe!(unix, "/tmp/local/unix", "sub", sub).await;