use std::time::Duration;
use ruststream::memory::prelude::*;
use serde::Deserialize;
use tracing::info;
#[derive(Debug, Deserialize)]
struct Resize {
id: u64,
width: u32,
}
#[derive(Debug, Deserialize)]
struct Audit {
id: u64,
}
fn render(job: &Resize) -> u64 {
(0..u64::from(job.width)).fold(job.id, |acc, x| acc.wrapping_mul(31).wrapping_add(x))
}
async fn notify(id: u64) {
tokio::time::sleep(Duration::from_millis(1)).await;
info!(id, "resized");
}
#[subscriber("images.resize", threads(8))]
async fn resize(job: &Resize, Ctx(main): Ctx<MainRuntime>) -> HandlerOutcome {
let _ = render(job);
main.spawn(notify(job.id));
HandlerOutcome::ack()
}
#[subscriber("audit")]
async fn audit(entry: &Audit) -> HandlerOutcome {
info!(entry.id, "audited");
HandlerOutcome::ack()
}
#[ruststream::app(flavor = "current_thread")]
fn app() -> impl App {
RustStream::new(AppInfo::new("images", "0.1.0")).with_broker(MemoryBroker::new(), |b| {
b.include(resize);
b.include(audit);
})
}