sm_macro 0.9.0

💋 SM – a static State Machine macro
Documentation
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);
}
```