use ruststream_fred::pubsub::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
struct Event {
kind: String,
}
#[derive(Debug, Serialize, Outgoing)]
#[outgoing(name = "audit")]
struct AuditEntry {
kind: String,
}
#[subscriber(RedisPubSub::new("events"), reply)]
async fn on_event(event: &Event) -> AuditEntry {
println!("event: {}", event.kind);
AuditEntry {
kind: event.kind.clone(),
}
}
#[subscriber(RedisPubSubPattern::new("events.*"))]
async fn on_any_event(event: &Event) -> HandlerOutcome {
println!("matched event: {}", event.kind);
HandlerOutcome::ack()
}
#[subscriber(RedisPubSub::new("events").mode(PubSubMode::Sharded))]
async fn on_event_sharded(event: &Event) -> HandlerOutcome {
println!("sharded event: {}", event.kind);
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("events", "0.1.0"))
.with_broker(RedisBroker::standalone("redis://localhost:6379"), |b| {
b.include(on_event).out_reply(Publish::default());
b.include(on_any_event)
.out_retry(Publish::default())
.to("events.retry");
})
.with_broker(RedisBroker::cluster(["redis://localhost:7000"]), |b| {
b.include(on_event_sharded);
})
}