use sfsm::*;
#[derive(Debug)]
pub struct Launch {}
pub struct WaitForLaunch {}
add_state_machine!(
Rocket, WaitForLaunch, [WaitForLaunch, Launch], [
WaitForLaunch => Launch, ]
);
impl State for WaitForLaunch {
fn entry(&mut self) {
println!("WaitForLaunch: Entry")
}
fn execute(&mut self) {
println!("WaitForLaunch: Execute");
}
fn exit(&mut self) {
println!("WaitForLaunch: Exit");
}
}
impl Into<Launch> for WaitForLaunch {
fn into(self) -> Launch { Launch {} }
}
impl Transition<Launch> for WaitForLaunch {
fn action(&mut self) {
println!("WaitForLaunch => Launch: Exit");
}
fn guard(&self) -> TransitGuard {
println!("WaitForLaunch => Launch: Guard");
return TransitGuard::Transit;
}
}
impl State for Launch {
fn entry(&mut self) {
println!("Launch: Entry")
}
fn execute(&mut self) {
println!("Launch: Execute");
}
fn exit(&mut self) {
println!("Launch: Exit");
}
}
#[sfsm_trace]
fn trace(log: &str) {
println!("{}", log);
}
fn run_basic_example() -> Result<(), SfsmError> {
let mut rocket = Rocket::new();
let wait_for_launch = WaitForLaunch {};
rocket.start(wait_for_launch)?;
assert!(IsState::<WaitForLaunch>::is_state(&rocket));
rocket.step()?;
assert!(IsState::<Launch>::is_state(&rocket));
let stopped_state = rocket.stop()?;
match stopped_state {
match_state_entry!(Rocket, Launch, exit_state) => {
println!("Exit state: {:?}", exit_state);
assert!(true);
}
_ => {
assert!(false);
}
}
Ok(())
}
fn main() {
run_basic_example().unwrap();
}
#[cfg(test)]
mod tests {
use crate::run_basic_example;
#[test]
fn basic_example() {
run_basic_example().unwrap();
}
}