use durare::{
Client, DurableContext, DurableEngine, InMemoryProvider, ListFilter, Result, WorkflowOptions,
WorkflowQueue,
};
use std::sync::Arc;
use std::time::Duration;
#[durare::step]
async fn render(ctx: &DurableContext, month: String) -> Result<String> {
tokio::time::sleep(Duration::from_millis(50)).await;
Ok(format!("report for {month}: 42 pages"))
}
#[durare::workflow]
async fn monthly_report(ctx: DurableContext, month: String) -> Result<String> {
render(&ctx, month).await
}
#[tokio::main]
async fn main() -> Result<()> {
let provider = Arc::new(InMemoryProvider::new());
let mut engine = DurableEngine::new(provider.clone()).await?;
engine.register_queue(WorkflowQueue::new("reports"));
engine.launch().await?;
let client = Client::new(provider.clone());
println!("[client] enqueue monthly_report for 2026-07");
let handle = client
.enqueue::<_, String>(
"reports",
"monthly_report",
"2026-07".to_string(),
WorkflowOptions::with_id("report-jul"),
)
.await?;
let rows = client
.list_workflows(&ListFilter {
workflow_id_prefix: vec!["report-".to_string()],
..Default::default()
})
.await?;
println!(
"[client] observing {} workflow(s): {} is {}",
rows.len(),
rows[0].id,
rows[0].status
);
let report = handle.result().await?;
println!("[client] result: {report}");
let steps = client.get_workflow_steps("report-jul").await?;
println!(
"[client] {} step(s) recorded: {:?}",
steps.len(),
steps.iter().map(|s| &s.name).collect::<Vec<_>>()
);
let again = client.retrieve_workflow::<String>("report-jul").await?;
println!("[client] re-retrieved by id: {}", again.result().await?);
engine.shutdown(Duration::from_secs(1)).await?;
Ok(())
}