Macro krpc::define

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即为订阅的数据类型
  • 注意:
    • 不需要在方法参数表第一个参数指明self,此宏会自己生成
    • 当同时存在fn与sub方法声明时,以fn开头的所有方法声明必须在以sub的前面,即先fn声明在前,sub声明在后

example

//实现SubcribeCallback trait进行回调处理
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)
);

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)
);
//如上定义会生成一个新类型Test,包含方法rpc1、rpc2、rpc3、rpc4、onOpen、onClose生成的新类型代码大致如下所示:
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> {...} //此方法若var.callback()的返回值是true就一直执行直到出错才返回,若返回值是false则立即返回Ok(())
}