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.

input
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(),
    }
}
  1. 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);
  2. 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}");
  3. 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
  1. 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);
  2. command ← (empty)

    8let input = "done:task";9let comman→ (empty)d = parse_command(inpu"done:task"t);10let message = describe(comman(empty)d);11println!("{message}");
  3. 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
  1. input ← "noop"

    7fn main() {8    let inpu→ "noop"t = "noop";9    let command = parse_command(inpu"noop"t);10    let message = describe(command);
  2. command ← (empty)

    8let input = "noop";9let comman→ (empty)d = parse_command(inpu"noop"t);10let message = describe(comman(empty)d);11println!("{message}");
  3. 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.