use ruststream::OutgoingMessage;
use ruststream_fred::stream::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Outgoing)]
struct Order {
id: u64,
}
#[subscriber("orders", reply("processed"))]
async fn process(orders: &[Order]) -> Result<Vec<Order>, HandlerOutcome> {
if orders.is_empty() {
return Err(HandlerOutcome::drop());
}
Ok(orders.iter().map(|o| Order { id: o.id }).collect())
}
#[ruststream::app]
fn app() -> impl App {
let broker = RedisBroker::standalone("redis://localhost:6379").default_group("workers");
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(broker, |b| {
b.include(process.batch(nonzero!(32)))
.out_reply(TransactionalPublish)
.transactional();
b.after_startup(TransactionalPublish, async move |publisher| {
let mut seed = publisher.transaction().await?;
seed.publish(
OutgoingMessage::new("processed", br#"{"id":0}"#.as_slice()),
None,
)
.await?;
seed.commit().await
});
})
}