use durare::{DurableContext, DurableEngine, InMemoryProvider, Result, StreamExt, WorkflowOptions};
use std::sync::Arc;
use std::time::Duration;
#[durare::workflow]
async fn crunch(ctx: DurableContext, items: i64) -> Result<i64> {
for i in 1..=items {
ctx.write_stream("progress", format!("processed {i}/{items}"))
.await?;
tokio::time::sleep(Duration::from_millis(80)).await;
}
ctx.close_stream("progress").await?;
Ok(items)
}
#[tokio::main]
async fn main() -> Result<()> {
let engine = DurableEngine::new(Arc::new(InMemoryProvider::new())).await?;
let handle = engine
.start_with(Crunch, 5i64, WorkflowOptions::with_id("job-1"))
.await?;
println!("[reader] tailing job-1/progress:");
let mut feed = engine.read_stream_values::<String>("job-1", "progress");
while let Some(item) = feed.next().await {
match item {
Ok(msg) => println!(" << {msg}"),
Err(e) => {
eprintln!(" stream error: {e}");
break;
}
}
}
let processed = handle.await?;
println!("[done] workflow processed {processed} items");
Ok(())
}