#[derive(Debug)]
/// コントローラが反応する必要があるエレベーター システム内のイベント。
enum Event {
/// ボタンが押された。
ButtonPressed(Button),
/// 車両が所定の階に到着した。
CarArrived(Floor),
/// かごのドアが開いた。
CarDoorOpened,
/// かごのドアが閉まった。
CarDoorClosed,
}
/// 階は整数として表される。
type Floor = i32;
/// 運転方向。
#[derive(Debug)]
enum Direction {
Up,
Down,
}
/// ユーザーがアクセスできるボタン。
#[derive(Debug)]
enum Button {
/// 所定の階のエレベーター ロビーにあるボタン。
LobbyCall(Direction, Floor),
/// かご内の階数ボタン。
CarFloor(Floor),
}
/// かごが所定の階に到着した。
fn car_arrived(floor: i32) -> Event {
Event::CarArrived(floor)
}
/// かごのドアが開いた。
fn car_door_opened() -> Event {
Event::CarDoorOpened
}
/// かごのドアが閉まった。
fn car_door_closed() -> Event {
Event::CarDoorClosed
}
/// 所定の階のエレベーター ロビーで方向ボタンが押された。
fn lobby_call_button_pressed(floor: i32, dir: Direction) -> Event {
Event::ButtonPressed(Button::LobbyCall(dir, floor))
}
/// エレベーターのかごの階数ボタンが押された。
fn car_floor_button_pressed(floor: i32) -> Event {
Event::ButtonPressed(Button::CarFloor(floor))
}
fn main() {
println!(
"A ground floor passenger has pressed the up button: {:?}",
lobby_call_button_pressed(0, Direction::Up)
);
println!("The car has arrived on the ground floor: {:?}", car_arrived(0));
println!("The car door opened: {:?}", car_door_opened());
println!(
"A passenger has pressed the 3rd floor button: {:?}",
car_floor_button_pressed(3)
);
println!("The car door closed: {:?}", car_door_closed());
println!("The car has arrived on the 3rd floor: {:?}", car_arrived(3));
}