Parser Capstone
Command Parser
Convert Text into an Enum
A parser can turn raw command text into an enum so later code handles typed cases instead of strings.
Program
Play the program to choose a command string and route the parsed enum.
command_enum_parser.rs
Replay: real traced execution (multi-file project)
enum Command {
Add(String),
Done(String),
Unknown,
}
fn main() {
let input = "add:task";
let command = parse_command(input);
let message = describe(command);
println!("{message}");
}
fn parse_command(input: &str) -> Command {
match input.split_once(':') {
Some(("add", value)) => Command::Add(value.to_string()),
Some(("done", value)) => Command::Done(value.to_string()),
_ => Command::Unknown,
}
}
fn describe(command: Command) -> String {
match command {
Command::Add(value) => format!("add:{value}"),
Command::Done(value) => format!("done:{value}"),
Command::Unknown => "unknown".to_string(),
}
}
enum Command {
Add(String),
Done(String),
Unknown,
}
fn main() {
let input = "done:task";
let command = parse_command(input);
let message = describe(command);
println!("{message}");
}
fn parse_command(input: &str) -> Command {
match input.split_once(':') {
Some(("add", value)) => Command::Add(value.to_string()),
Some(("done", value)) => Command::Done(value.to_string()),
_ => Command::Unknown,
}
}
fn describe(command: Command) -> String {
match command {
Command::Add(value) => format!("add:{value}"),
Command::Done(value) => format!("done:{value}"),
Command::Unknown => "unknown".to_string(),
}
}
enum Command {
Add(String),
Done(String),
Unknown,
}
fn main() {
let input = "noop";
let command = parse_command(input);
let message = describe(command);
println!("{message}");
}
fn parse_command(input: &str) -> Command {
match input.split_once(':') {
Some(("add", value)) => Command::Add(value.to_string()),
Some(("done", value)) => Command::Done(value.to_string()),
_ => Command::Unknown,
}
}
fn describe(command: Command) -> String {
match command {
Command::Add(value) => format!("add:{value}"),
Command::Done(value) => format!("done:{value}"),
Command::Unknown => "unknown".to_string(),
}
}
input ← "add:task"
7fn main() {8 let inpu→ "add:task"t = "add:task"; //@input="add:task", "done:task", "noop"9 let command = parse_command(inpu"add:task"t);10 let message = describe(command);command ← (empty)
8let input = "add:task"; //@input="add:task", "done:task", "noop"9let comman→ (empty)d = parse_command(inpu"add:task"t);10let message = describe(comman(empty)d);11println!("{message}");message ← "add:task"
9 let command = parse_command(input);10 let messag→ "add:task"e = describe(comman(empty)d);11 println!("{message}");12}outputadd:task
input ← "done:task"
7fn main() {8 let inpu→ "done:task"t = "done:task";9 let command = parse_command(inpu"done:task"t);10 let message = describe(command);command ← (empty)
8let input = "done:task";9let comman→ (empty)d = parse_command(inpu"done:task"t);10let message = describe(comman(empty)d);11println!("{message}");message ← "done:task"
9 let command = parse_command(input);10 let messag→ "done:task"e = describe(comman(empty)d);11 println!("{message}");12}outputdone:task
input ← "noop"
7fn main() {8 let inpu→ "noop"t = "noop";9 let command = parse_command(inpu"noop"t);10 let message = describe(command);command ← (empty)
8let input = "noop";9let comman→ (empty)d = parse_command(inpu"noop"t);10let message = describe(comman(empty)d);11println!("{message}");message ← "unknown"
9 let command = parse_command(input);10 let messag→ "unknown"e = describe(comman(empty)d);11 println!("{message}");12}outputunknown
enum parser
`parse_command` converts raw text into a typed `Command` value.
payload
`Add` and `Done` carry the parsed task name as owned `String` data.
routing
`describe` matches the enum instead of reparsing the original string.