An enum captures a closed set of possible states, and helper functions keep conversion and display logic together.

Program

Play the program to choose a state code and build a typed ticket.

state_code
enum_ticket_state.rs
Replay: real traced execution (multi-file project)
enum TicketState {
    Open,
    Closed,
    Escalated,
}

struct Ticket {
    id: u32,
    state: TicketState,
}

fn main() {
    let state_code = 1;
    let ticket = Ticket { id: 42, state: state_from(state_code) };
    let label = state_label(&ticket.state);
    println!("{}:{}", ticket.id, label);
}

fn state_from(code: u8) -> TicketState {
    match code {
        0 => TicketState::Open,
        1 => TicketState::Closed,
        _ => TicketState::Escalated,
    }
}

fn state_label(state: &TicketState) -> &'static str {
    match state {
        TicketState::Open => "open",
        TicketState::Closed => "closed",
        TicketState::Escalated => "escalated",
    }
}
enum TicketState {
    Open,
    Closed,
    Escalated,
}

struct Ticket {
    id: u32,
    state: TicketState,
}

fn main() {
    let state_code = 0;
    let ticket = Ticket { id: 42, state: state_from(state_code) };
    let label = state_label(&ticket.state);
    println!("{}:{}", ticket.id, label);
}

fn state_from(code: u8) -> TicketState {
    match code {
        0 => TicketState::Open,
        1 => TicketState::Closed,
        _ => TicketState::Escalated,
    }
}

fn state_label(state: &TicketState) -> &'static str {
    match state {
        TicketState::Open => "open",
        TicketState::Closed => "closed",
        TicketState::Escalated => "escalated",
    }
}
enum TicketState {
    Open,
    Closed,
    Escalated,
}

struct Ticket {
    id: u32,
    state: TicketState,
}

fn main() {
    let state_code = 2;
    let ticket = Ticket { id: 42, state: state_from(state_code) };
    let label = state_label(&ticket.state);
    println!("{}:{}", ticket.id, label);
}

fn state_from(code: u8) -> TicketState {
    match code {
        0 => TicketState::Open,
        1 => TicketState::Closed,
        _ => TicketState::Escalated,
    }
}

fn state_label(state: &TicketState) -> &'static str {
    match state {
        TicketState::Open => "open",
        TicketState::Closed => "closed",
        TicketState::Escalated => "escalated",
    }
}
  1. state_code ← 1

    12fn main() {13    let state_cod→ 1e = 1; //@state_code=1, 0, 214    let ticket = Ticket { id: 42, state: state_from(state_cod1e) };15    let label = state_label(&ticket.state);
  2. ticket ← (empty)

    13let state_code = 1; //@state_code=1, 0, 214let ticke→ (empty)t = Ticket { id: 42, state: state_from(state_cod1e) };15let label = state_label(&ticket.stat(empty)e);16println!("{}:{}", ticket.id, label);
  3. label ← "closed"

    14    let ticket = Ticket { id: 42, state: state_from(state_code) };15    let labe→ "closed"l = state_label(&ticket.stat(empty)e);16    println!("{}:{}", ticket.id, label);17}
    output42:closed
  1. state_code ← 0

    12fn main() {13    let state_cod→ 0e = 0;14    let ticket = Ticket { id: 42, state: state_from(state_cod0e) };15    let label = state_label(&ticket.state);
  2. ticket ← (empty)

    13let state_code = 0;14let ticke→ (empty)t = Ticket { id: 42, state: state_from(state_cod0e) };15let label = state_label(&ticket.stat(empty)e);16println!("{}:{}", ticket.id, label);
  3. label ← "open"

    14    let ticket = Ticket { id: 42, state: state_from(state_code) };15    let labe→ "open"l = state_label(&ticket.stat(empty)e);16    println!("{}:{}", ticket.id, label);17}
    output42:open
  1. state_code ← 2

    12fn main() {13    let state_cod→ 2e = 2;14    let ticket = Ticket { id: 42, state: state_from(state_cod2e) };15    let label = state_label(&ticket.state);
  2. ticket ← (empty)

    13let state_code = 2;14let ticke→ (empty)t = Ticket { id: 42, state: state_from(state_cod2e) };15let label = state_label(&ticket.stat(empty)e);16println!("{}:{}", ticket.id, label);
  3. label ← "escalated"

    14    let ticket = Ticket { id: 42, state: state_from(state_code) };15    let labe→ "escalated"l = state_label(&ticket.stat(empty)e);16    println!("{}:{}", ticket.id, label);17}
    output42:escalated
enum `TicketState` makes the allowed states explicit and finite.
conversion `state_from` converts a raw code into the typed model.
display helper `state_label` keeps presentation labels close to the model.