Rust ADTs and pattern matching are so much better than other mainstream languages I find that once my code compiles it actually is almost always correct.
The next step is to encode your transition logic in the From impls between the enum structs and you've got yourself a first-rate state machine.