use foundation_core::valtron::{execute, task, valtron, Ctx, StreamIteratorExt, TaskStatus};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum Stage {
Foundation,
Walls,
Roof,
Done,
}
#[derive(Debug, PartialEq)]
struct House {
walls: u32,
}
#[task]
fn build_house(ctx: Ctx, stage: Stage) -> Option<(Stage, TaskStatus<House, ()>)> {
let _ = ctx;
match stage {
Stage::Foundation => Some((Stage::Walls, TaskStatus::Ignore)),
Stage::Walls => Some((Stage::Roof, TaskStatus::Ignore)),
Stage::Roof => Some((Stage::Done, TaskStatus::Ready(House { walls: 4 }))),
Stage::Done => None,
}
}
#[valtron]
async fn main() {
let (house, _rest) = execute(build_house::new(Stage::Foundation), None)
.expect("engine live")
.into_ready_future()
.await
.expect("a house was built");
assert_eq!(house, House { walls: 4 });
println!("sync build_house -> {house:?}");
let (next, status) = build_house(Ctx::new(), Stage::Walls).expect("transition step");
assert_eq!(next, Stage::Roof);
assert_eq!(status, TaskStatus::Ignore);
}