CI

rusty_state

A simple state machine for rust

Example

Copied from tests

```rust // define an traffic light enumeration

[derive(Clone, Copy, PartialEq)]

enum TrafficLight { Red, RedYellow, Green, Yellow }

// implement State trait for state enumeration impl State for TrafficLight { fn transitionallowed(self, newstate: TrafficLight) -> bool { match (self, new_state) { (TrafficLight::Red, TrafficLight::RedYellow) => true, (TrafficLight::RedYellow, TrafficLight::Green) => true, (TrafficLight::Green, TrafficLight::Yellow) => true, (TrafficLight::Yellow, TrafficLight::Red) => true, _ => false } } }

[derive(Clone, Copy, PartialEq)]

enum TrafficFeature { Drive }

impl Feature for TrafficFeature { fn allowed(self, state: &TrafficLight) -> bool { match state { TrafficLight::Green => true, _ => false } } }

// usage

[test]

fn trafficlighttransitions() { let mut statemachine = StateMachine::new(TrafficLight::Red); assert!(statemachine.set(TrafficLight::RedYellow).isok()); assert!(statemachine.set(TrafficLight::Green).isok()); assert!(statemachine.set(TrafficLight::Yellow).isok()); assert!(statemachine.set(TrafficLight::RedYellow).is_err()); }

[test]

fn trafficlightfeatures() { let mut statemachine = StateMachine::new(TrafficLight::Red); assert!(!statemachine.feature_allowed(&TrafficFeature::Drive));

assert!(state_machine.set(&TrafficLight::RedYellow).is_ok());
assert!(!state_machine.feature_allowed(&TrafficFeature::Drive));

assert!(state_machine.set(&TrafficLight::Green).is_ok());
assert!(state_machine.feature_allowed(&TrafficFeature::Drive));

assert!(state_machine.set(&TrafficLight::Yellow).is_ok());
assert!(!state_machine.feature_allowed(&TrafficFeature::Drive));

} ```