Solução

#[derive(Debug)]
/// Um evento no sistema de elevador ao qual o controlador deve reagir.
enum Event {
    /// Um botão foi pressionado.
    ButtonPressed(Button),

    /// O elevador chegou no andar dado.
    CarArrived(Floor),

    /// As portas do elevador se abriram.
    CarDoorOpened,

    /// As portas do elevador se fecharam.
    CarDoorClosed,
}

/// Um andar é representado como um inteiro.
type Floor = i32;

/// Uma direção da viagem.
#[derive(Debug)]
enum Direction {
    Up,
    Down,
}

/// Um botão acessível ao usuário.
#[derive(Debug)]
enum Button {
    /// Um botão no saguão do elevador no andar dado.
    LobbyCall(Direction, Floor),

    /// Um botão de andar dentro do elevador.
    CarFloor(Floor),
}

/// O elevador chegou no andar dado.
fn car_arrived(floor: i32) -> Event {
    Event::CarArrived(floor)
}

/// As portas do elevador se abriram.
fn car_door_opened() -> Event {
    Event::CarDoorOpened
}

/// As portas do elevador se fecharam.
fn car_door_closed() -> Event {
    Event::CarDoorClosed
}

/// Um botão direcional foi pressionado em um saguão de elevador no andar dado.
fn lobby_call_button_pressed(floor: i32, dir: Direction) -> Event {
    Event::ButtonPressed(Button::LobbyCall(dir, floor))
}

/// Um botão de andar foi pressionado no elevador.
fn car_floor_button_pressed(floor: i32) -> Event {
    Event::ButtonPressed(Button::CarFloor(floor))
}

fn main() {
    println!(
        "Um passageiro do térreo pressionou o botão para subir: {:?}",
        lobby_call_button_pressed(0, Direction::Up)
    );
    println!("O elevador chegou no térreo: {:?}", car_arrived(0));
    println!("A porta do elevador se abriu: {:?}", car_door_opened());
    println!(
        "Um passageiro pressionou o botão do 3º andar: {:?}",
        car_floor_button_pressed(3)
    );
    println!("A porta do elevador se fechou: {:?}", car_door_closed());
    println!("O elevador chegou no 3º andar: {:?}", car_arrived(3));
}