use foundation_core::valtron;
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,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Recipe {
mixed: bool,
baked: bool,
}
#[derive(Debug, PartialEq)]
struct Cake {
layers: u32,
}
#[task]
fn bake_cake(ctx: Ctx, recipe: Recipe) -> Option<(Recipe, TaskStatus<Cake, ()>)> {
let _ = ctx;
match (recipe.mixed, recipe.baked) {
(false, _) => Some((Recipe { mixed: true, ..recipe }, TaskStatus::Ignore)),
(true, false) => Some((
Recipe { mixed: true, baked: true },
TaskStatus::Ready(Cake { layers: 3 }),
)),
(true, true) => 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 });
let (cake, _rest) = execute(bake_cake::new(Recipe { mixed: false, baked: false }), None)
.expect("engine live")
.into_ready_future()
.await
.expect("a cake was baked");
assert_eq!(cake, Cake { layers: 3 });
println!("enum build_house -> {house:?}");
println!("struct bake_cake -> {cake:?}");
assert_eq!(
build_house(Ctx::new(), Stage::Walls),
Some((Stage::Roof, TaskStatus::Ignore))
);
assert_eq!(
bake_cake(Ctx::new(), Recipe { mixed: false, baked: false }),
Some((Recipe { mixed: true, baked: false }, TaskStatus::Ignore))
);
}