Typestate in Rust: Enforcing State Machine Rules at Compile Time

Functional State Machines in Rust: Typestate and Newtype Patterns

This paper explores how Rust's type system can model state machines, using typestate and newtype patterns to enforce protocol correctness at compile time. It demonstrates encoding states as types and transitions as methods, preventing invalid operations and reducing runtime errors. The approach leverages Rust's zero-cost abstractions, offering a robust alternative to runtime checks for domain logic.

By encoding states as types, the compiler becomes the runtime check, ensuring that invalid transitions are rejected before the program even runs.
  1. vatsachak

    Types are puzzles. A good Rustacean will make sure that the pieces fit to make the picture.

    That's why in crates where I need to make sure certain functions are called in order, I use a Ticket<T>, where one function returns a Ticket<Func1Done> with the output and the other has to consume it as an input.

    The typestate pattern is a specialization of making only valid states representable

  2. doyougnu

    This was a talk at the FUNARCH workshop at this year’s ICFP.

    Here’s the livestream: https://www.youtube.com/live/c0pw1iVs_Q0?is=hwm2xa4cZOcqF5tW

    Well post the individual talks in the following days!

  3. arpinum

    I use Typestates and Newtypes extensively. The metric that shows Typestate and Newtypes are beneficial is: How many method calls or parameters can be called / used that compile but are not valid use cases. You want to minimise this number. I love having a type state where I can only make 1 or 2 method calls because the state enforces there are only a few parsing / validation / transition methods available. And there is only one valid way to supply the parameters, I cannot use the strings in the wrong location. I only wish we had named parameters like ObjC.

  4. michaelnoguera

    pdf: https://dl.acm.org/doi/pdf/10.1145/3830438.3830958

  5. bana-io

    Maybe I am missing something but where is the entire source code?

More from this day

2026-08-29