SM aims to be a **safe**, **fast** and **simple** state machine library.
- **safe** — Rust's type system, ownership model and exhaustive pattern matching
prevent you from mis-using your state machines
- **fast** — zero runtime overhead, the machine is 100% static, all validation
happens at compile-time
- **simple** — five traits, and one optional declarative macro, control-flow
only, no business logic attached
---
You might be looking for:
- [An overview of SM][book]
- [Our GitHub repository][repo]
- [Examples][examples]
- [API documentation][api]
[book]: https://github.com/rustic-games/sm/blob/master/README.md#descriptive-example
[repo]: https://github.com/rustic-games/sm
[examples]: https://github.com/rustic-games/sm/tree/master/examples
[api]: https://docs.rs/sm
## Quick Example
```rust
extern crate sm;
use sm::sm;
sm! {
Lock {
InitialStates { Locked }
TurnKey {
Locked => Unlocked
Unlocked => Locked
}
Break {
Locked, Unlocked => Broken
}
}
}
fn main() {
use Lock::*;
let lock = Machine::new(Locked);
let lock = lock.transition(TurnKey);
assert_eq!(lock.state(), Unlocked);
assert_eq!(lock.trigger().unwrap(), TurnKey);
}
```