Macro Attributes

The #[typestate] macro exposes some extra features through attribute parameters. This chapter introduces them and provides simple examples.

enumerate

The enumerate parameter will generate an additional enum containing all states; this is useful when dealing with anything that requires a more "general" concept of state.

Consider the file examples/light_bulb.rs:

#![allow(unused)] fn main() { #[typestate(enumerate = "LightBulbStates")] mod light_bulb { #[state] struct On; #[state] struct Off; // ... } }

Using the enumerate attribute will add the following enum to the expansion:

#![allow(unused)] fn main() { pub enum LightBulbStates { Off(LightBulb<Off>), On(LightBulb<On>), } }

state_constructors

The state_constructors parameter will generate additional constructors for each state with fields; this is useful when declaring states inside the automaton.

Consider the following example state:

#![allow(unused)] fn main() { #[typestate(state_constructors = "new_state")] mod light_bulb { #[state] struct On { color: [u8; 3] } // ... } }

When compiled, the following constructor is generated:

#![allow(unused)] fn main() { impl On { pub fn new_state(color: [u8; 3]) -> Self { Self { color } } } }