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:?}");
}