#![deny(missing_docs)]
use sml::sml;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GuardError {
Custom,
}
#[derive(PartialEq)]
pub struct MyEventData(pub u32);
#[derive(PartialEq)]
pub struct MyStateData(pub u32);
sml! {
_[custom_error] {
*State1 + Event1(MyEventData) [guard1] / action1 = State2,
State2(MyStateData) + Event2 [guard2] / action2 = State3,
}
}
pub struct Context;
impl StateMachineContext for Context {
type Error = GuardError; fn guard1(&self, _event_data: &MyEventData) -> Result<bool, GuardError> {
Err(GuardError::Custom)
}
fn action1(&mut self, event_data: MyEventData) -> Result<MyStateData, Self::Error> {
Ok(MyStateData(event_data.0))
}
fn guard2(&self, state_data: &MyStateData) -> Result<bool, GuardError> {
Ok(state_data.0 > 0)
}
fn action2(&mut self, _state_data: &MyStateData) -> Result<(), Self::Error> {
Ok(())
}
}
fn main() {
let mut sm = StateMachine::new(Context {});
let r = sm.process_event(Events::Event1(MyEventData(1)));
assert!(matches!(r, Err(Error::GuardFailed(GuardError::Custom))));
}