Skip to content

iddm/fxsm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fxsm

MIT licensed

A very simple state machine procedural macro for enums.

How does it work

It simply generates match conditions on your enums in appropriate StateMachine trait's methods. You may use the state machine through a StateMachine trait.

Usage

  1. Add fxsm as dependency in your Cargo.toml:
[dependencies]
fxsm-derive = "0.2"
fxsm = "0.2"
  1. Create a State Machine:
#[macro_use]
extern crate fxsm_derive;
extern crate fxsm;


#[derive(Clone, Debug, FiniteStateMachine)]
enum CupState {
    #[state_transitions(Checkins, Aborted, Rescheduled)]
    Waiting,
    #[state_transitions(InProgress, Aborted, Rescheduled)]
    Checkins,
    #[state_transitions(Finished, Aborted, Rescheduled)]
    InProgress(String),

    // Finish-states
    Aborted(u64),
    Rescheduled { info: String },
    Finished,
}
  1. Use it:
fn main() {
    use fxsm::{ StateMachine };
    let mut fsm = CupState::Waiting;
    assert_eq!(CupState::finish_states(), 3);
    // must not be able to change to itself
    assert!(!fsm.can_change(CupState::Waiting));
    assert!(fsm.can_change(CupState::Checkins));
    assert!(!fsm.can_change(CupState::InProgress(String::default())));
    assert!(fsm.can_change(CupState::Aborted(0u64)));
    assert!(fsm.can_change(CupState::Rescheduled{info: String::default()}));
    assert!(!fsm.can_change(CupState::Finished));
    assert!(!fsm.at_finish_state());

    assert!(fsm.change(CupState::Checkins));
    assert!(!fsm.can_change(CupState::Waiting));
    assert!(fsm.can_change(CupState::Aborted(0u64)));
    assert!(fsm.can_change(CupState::Rescheduled{info: String::default()}));
    assert!(fsm.can_change(CupState::InProgress(String::default())));
    assert!(!fsm.can_change(CupState::Finished));
    assert!(!fsm.at_finish_state());

    // You still always able to change it without FSM rules:
    fsm = CupState::Finished;
    assert!(fsm.at_finish_state());
    assert!(CupState::is_finish_state(CupState::Finished));
    assert!(CupState::is_finish_state(CupState::Aborted(0u64)));
    assert!(CupState::is_finish_state(CupState::Rescheduled{ info: String::default()}));
    assert!(!CupState::is_finish_state(CupState::Waiting));
    assert!(!CupState::is_finish_state(CupState::Checkins));
    assert!(!CupState::is_finish_state(CupState::InProgress(String::default())));
}

More and updated examples are in examples directory.

License

This project is licensed under the MIT license.

Releases

No releases published

Packages

No packages published

Languages