Рішення

#[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));
}