如何将RabbitMQ自定义参数解析为结构?

时间:2020-02-24 14:07:38

标签: rust rabbitmq

我正在尝试为函数创建自定义属性,该函数将属性参数解析为Queue(结构),Exchange(结构)和routing_key(文字)。这些将用于通过从QueueExchange的路由来声明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);
}

如何将这些参数解析为结构?有没有更好的方法可以实现我想要做的事情?

0 个答案:

没有答案