我正在尝试为函数创建自定义属性,该函数将属性参数解析为Queue
(结构),Exchange
(结构)和routing_key
(文字)。这些将用于通过从Queue
到Exchange
的路由来声明RabbitMq routing_key
。该函数本身将用作消息使用者。这些细节并不重要,但这是所有这些背后的原因。
我已经能够将参数解析为文字:
#[proc_macro_attribute]
pub fn consume(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as AttributeArgs);
let arguments = args.iter().map(|arg| {
match arg {
NestedMeta::Lit(Lit::Str(lit)) => lit.value(),
_ => "".to_string()
}
}).collect::<Vec<String>>();
let queue = arguments.get(0);
let exchange = arguments.get(1);
let routing_key = arguments.get(2);
declare_queue(queue);
declare_exchange(exchange);
declare_binding(exchange, routing_key, queue);
input
}
该属性的用法如下:
#[consume("my.queue", "my.exchange", "my.routing.key")]
fn my_test(message: String) {
println!("Received: {}", message);
}
缺少用作消费者的功能。这种方法的问题在于队列和交换可以具有属性。因此,为了正确地声明它们,我需要一个类似以下的属性:
#[consume(Queue { name: "my.queue", properties: { durable: true, exclusive: false, auto_delete: false } }, Exchange {name: "my.exchange", proeprties { type: "topic", durable: true, auto_delete: false } }, "my.routing.key")]
fn my_test(message: String) {
println!("Received: {}", message);
}
如何将这些参数解析为结构?有没有更好的方法可以实现我想要做的事情?