use std::time::Duration;
use ruststream_lapin::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
struct Order {
id: u64,
expedited: bool,
}
#[derive(Debug, Outgoing, Serialize)]
#[outgoing(name = "shipments")]
struct Shipment {
order_id: u64,
}
#[subscriber("orders")]
async fn ship(
order: &Order,
Out(shipments): Out<impl Publisher<Options = LapinPublishOptions>>,
) -> HandlerOutcome {
let shipment = Shipment { order_id: order.id };
let sent = if order.expedited {
shipments
.message(&shipment)
.priority(9)
.expiration(Duration::from_hours(1))
.publish()
.await
} else {
shipments.message(&shipment).publish().await
};
if sent.is_err() {
return HandlerOutcome::retry();
}
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
let broker = LapinBroker::new("amqp://localhost:5672");
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(broker, |b| {
b.include(ship)
.out(DefaultSlot, Publish::default().priority(3))
.build();
})
}