Skip to content

Instantly share code, notes, and snippets.

@kwarrick
Created April 16, 2019 20:40
Show Gist options
  • Save kwarrick/88f2008f383a4d751bce276ab5bb6058 to your computer and use it in GitHub Desktop.
Save kwarrick/88f2008f383a4d751bce276ab5bb6058 to your computer and use it in GitHub Desktop.
State machine using enums in Rust
#[derive(Debug)]
enum State {
New(Option<String>),
Running(String),
Failure(Box<State>),
}
enum Event {
Open(String),
Run,
}
impl State {
// State transition logically consumes the state and event types
fn event(self, event: Event) -> Self {
match (&self, event) {
(State::New(_), Event::Open(s)) => State::New(Some(s)),
(State::New(Some(s)), Event::Run) => State::Running(s.to_owned()),
_ => State::Failure(Box::new(self))
}
}
}
fn main() {
let mut machine = State::New(None);
let events = vec![
Event::Open("foo".to_owned()), // new(none) -> new(some("foo"))
Event::Open("bar".to_owned()), // new(some("foo")) -> new(some("bar"))
Event::Run, // new(some("bar")) -> running
Event::Run, // running -> failure
];
for event in events {
machine = machine.event(event);
dbg!(&machine);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment