edfsm-machine 0.12.0

Tasks and Channels for Event Driven Finite State Machines
Documentation
pub mod fixtures;
use edfsm::Input;
use edfsm_machine::{error::Result, machine, Machine};
use fixtures::{Command, Counter, Event, Output};
use tokio::{
    sync::mpsc::{channel, Receiver, Sender},
    task::JoinSet,
};

async fn producer(sender: Sender<Input<Command, Event>>) -> Result<()> {
    for _ in 1..100 {
        sender.send(Input::Event(Event::Tick)).await?;
    }
    sender.send(Input::Command(Command::Assert(99))).await?;
    Ok(())
}

async fn consumer(mut receiver: Receiver<Output>) -> Result<()> {
    while let Some(o) = receiver.recv().await {
        println!("{o:?}")
    }
    Ok(())
}

fn build() -> impl Machine<Counter> {
    let log = Vec::<Event>::default();
    machine::<Counter>().with_event_log(log)
}

#[tokio::test]
async fn connection_test() {
    let (send_o, recv_o) = channel::<Output>(3);
    let (send_o2, recv_o2) = channel::<Output>(3);

    let builder = build().with_output(send_o).merge_output(send_o2);

    let prod_task = producer(builder.input());
    let cons_task = consumer(recv_o);
    let cons_task2 = consumer(recv_o2);

    let mut set = JoinSet::new();
    set.spawn(builder.task());
    set.spawn(cons_task);
    set.spawn(cons_task2);
    set.spawn(prod_task);
    set.join_all().await;
}