use ruststream::memory::MemoryMessage;
use ruststream::memory::prelude::*;
use ruststream::testing::TestApp;
use ruststream::{BuildContext, ContextField};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
struct Order {
id: u64,
}
struct DeliveryMeta {
payload_len: usize,
}
impl BuildContext<MemoryMessage> for DeliveryMeta {
fn build(msg: &MemoryMessage) -> Self {
Self {
payload_len: msg.payload().len(),
}
}
}
#[derive(Clone, Copy, Default)]
struct PayloadLen;
impl ContextField for PayloadLen {
type Context = DeliveryMeta;
type Value = usize;
fn read(self, src: &DeliveryMeta) -> usize {
src.payload_len
}
}
struct Audit;
impl Handle<Order, (), (), DeliveryMeta> for Audit {
async fn handle(
&self,
order: &Order,
_outs: &(),
ctx: &mut Context<'_, DeliveryMeta>,
) -> Result<(), HandlerOutcome> {
let Ctx(len) =
match <Ctx<PayloadLen> as FromContext<DeliveryMeta, ()>>::from_context(ctx).await {
Ok(value) => value,
Err(rejection) => return Err(HandlerOutcome::from(rejection)),
};
println!("order {} arrived as {len} bytes", order.id);
Ok(())
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let app =
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(MemoryBroker::new(), |b| {
b.include(subscriber("orders", Audit).build());
});
let tb = TestApp::start(app).await?;
tb.publish("orders", &Order { id: 40 }).await?;
println!("done");
Ok(())
}