ํ•ด๋‹ต

#[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!(
        "1์ธต ์Šน๊ฐ์ด ์œ„์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค. {:?}",
        lobby_call_button_pressed(0, Direction::Up)
    );
    println!("์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๊ฐ€ 1์ธต์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค: {:?}", car_arrived(0));
    println!("์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ๋ฌธ์ด ์—ด๋ ธ์Šต๋‹ˆ๋‹ค. {:?}", car_door_opened());
    println!(
        "์Šน๊ฐ์ด 3์ธต ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค. {:?}",
        car_floor_button_pressed(3)
    );
    println!("์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ๋ฌธ์ด ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค: {:?}", car_door_closed());
    println!("์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๊ฐ€ 3์ธต์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. {:?}", car_arrived(3));
}