How to Use Enums for State Machines in Rust

Define states with an enum and use match expressions to enforce valid transitions in Rust.

Use an enum to define valid states and a match expression to enforce transitions, ensuring the compiler rejects invalid state changes.

#[derive(Debug)]
enum TrafficLight {
    Red,
    Yellow,
    Green,
}

impl TrafficLight {
    fn next(&self) -> TrafficLight {
        match self {
            TrafficLight::Red => TrafficLight::Green,
            TrafficLight::Green => TrafficLight::Yellow,
            TrafficLight::Yellow => TrafficLight::Red,
        }
    }
}

fn main() {
    let mut light = TrafficLight::Red;
    light = light.next();
    println!("{light:?}");
}