#![deny(missing_docs)]
use smlang::statemachine;
statemachine! {
transitions: {
*Idle | Discharging | Discharged + Charge = Charging,
Idle | Charging | Charged + Discharge = Discharging,
Charging + ChargeComplete = Charged,
Discharging + DischargeComplete = Discharged,
_ + FaultDetected = Fault,
Fault + FaultCleard = Idle,
},
}
pub struct Context;
impl StateMachineContext for Context {}
fn main() {
let mut sm = StateMachine::new(Context);
assert!(matches!(sm.state(), &States::Idle));
let r = sm.process_event(Events::Charge);
assert!(matches!(r, Ok(&States::Charging)));
let r = sm.process_event(Events::Discharge);
assert!(matches!(r, Ok(&States::Discharging)));
let r = sm.process_event(Events::Charge);
assert!(matches!(r, Ok(&States::Charging)));
let r = sm.process_event(Events::ChargeComplete);
assert!(matches!(r, Ok(&States::Charged)));
let r = sm.process_event(Events::Charge);
assert!(matches!(r, Err(Error::InvalidEvent)));
assert!(matches!(sm.state(), &States::Charged));
let r = sm.process_event(Events::Discharge);
assert!(matches!(r, Ok(&States::Discharging)));
let r = sm.process_event(Events::DischargeComplete);
assert!(matches!(r, Ok(&States::Discharged)));
let r = sm.process_event(Events::Discharge);
assert!(matches!(r, Err(Error::InvalidEvent)));
assert!(matches!(sm.state(), &States::Discharged));
sm = StateMachine::new_with_state(Context, States::Idle);
let r = sm.process_event(Events::FaultDetected);
assert!(matches!(r, Ok(&States::Fault)));
sm = StateMachine::new_with_state(Context, States::Charging);
let r = sm.process_event(Events::FaultDetected);
assert!(matches!(r, Ok(&States::Fault)));
sm = StateMachine::new_with_state(Context, States::Charged);
let r = sm.process_event(Events::FaultDetected);
assert!(matches!(r, Ok(&States::Fault)));
sm = StateMachine::new_with_state(Context, States::Discharging);
let r = sm.process_event(Events::FaultDetected);
assert!(matches!(r, Ok(&States::Fault)));
sm = StateMachine::new_with_state(Context, States::Discharged);
let r = sm.process_event(Events::FaultDetected);
assert!(matches!(r, Ok(&States::Fault)));
let r = sm.process_event(Events::Charge);
assert!(matches!(r, Err(Error::InvalidEvent)));
assert!(matches!(sm.state(), &States::Fault));
let r = sm.process_event(Events::Discharge);
assert!(matches!(r, Err(Error::InvalidEvent)));
assert!(matches!(sm.state(), &States::Fault));
let r = sm.process_event(Events::ChargeComplete);
assert!(matches!(r, Err(Error::InvalidEvent)));
assert!(matches!(sm.state(), &States::Fault));
let r = sm.process_event(Events::DischargeComplete);
assert!(matches!(r, Err(Error::InvalidEvent)));
assert!(matches!(sm.state(), &States::Fault));
}