Data Modeling Capstone
Enum Ticket State
Model a Closed Set
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.
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",
}
}
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);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);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
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);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);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
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);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);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.