#[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!(
"Пасажир першого поверху натиснув кнопку вгору: {:?}",
lobby_call_button_pressed(0, Direction::Up)
);
println!("Кабіна ліфта заїхала на перший поверх: {:?}", car_arrived(0));
println!("Двері у кабіні ліфта відчинилися: {:?}", car_door_opened());
println!(
"Пасажир натиснув кнопку 3-го поверху: {:?}",
car_floor_button_pressed(3)
);
println!("Двері у кабіні ліфта зачинилися: {:?}", car_door_closed());
println!("Кабіна ліфта заїхала на 3-й поверх: {:?}", car_arrived(3));
}