use memable::{Context, Engine, EngineError, WorkflowState};
async fn greet(ctx: Context) -> Result<(), EngineError> {
let name: String = ctx.input::<String>()?.unwrap_or("world".into());
let message: String = ctx
.step("format-greeting:v1")
.run(async move || Ok(format!("Hello, {name}!")))
.await?;
println!("{message}");
Ok(())
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut engine = Engine::builder().in_memory().build();
engine.register("greet", greet);
engine.start().await?;
let state = engine
.invoke("greet")
.input("Alice".to_string())
.await?
.wait()
.await;
assert_eq!(state, WorkflowState::Completed(None));
let state = engine.invoke("greet").await?.wait().await;
assert_eq!(state, WorkflowState::Completed(None));
engine.stop().await;
Ok(())
}