vrsh 0.1.2

A simple shell written for my own learning.
use crate::shell::prompt::prompt_types::{PromptEscape, PromptCmdPart, PromptCmd, Argument};

grammar;

match {
    "%%" => ESCAPE_CHAR,
    "%n" => USERNAME,
    "%F" => START_FG_COLOR,
    "%f" => END_FG_COLOR,
    "%K" => START_BG_COLOR,
    "%k" => END_BG_COLOR,
    "%g" => GIT,
    "{" => LBRACE,
    "}" => RBRACE,
    r#"%([d/])"# => CWD,
    r#"%~"# => CWD_HOME,
    r#"%~>"# => CWD_HOME_CURRENT,
    r#"%~<"# => CWD_HOME_PARENTS,
    r#"[A-Z|a-z]*"# => WORD,
    r#"[0-1]?[0-9]?[0-9]"# => U8_LOW, // 0 -> 199
    r#"2[0-4][0-9]"# => U8_MID, // 200 -> 249
    r#"25[0-5]"# => U8_HIGH, // 250 -> 255
} else {
    r#"[^{}%]*"# => TEXT,
}

pub U8: u8 = {
    <n: U8_LOW> => n.parse::<u8>().unwrap(),
    <n: U8_MID> => n.parse::<u8>().unwrap(),
    <n: U8_HIGH> => n.parse::<u8>().unwrap(),
}

pub PromptCmd: PromptCmd = {
    <parts: PromptCmdPart*> => parts,
}

pub PromptCmdPart: PromptCmdPart = {
    <e: PromptExpansion> => PromptCmdPart::Escaped(e),
    TEXT => PromptCmdPart::Cmd(String::from(<>)),
}

PromptExpansion: PromptEscape = {
    ESCAPE_CHAR => PromptEscape::EscapeChar,
    USERNAME => PromptEscape::Username,
    CWD => PromptEscape::Cwd,
    CWD_HOME => PromptEscape::CwdHome,
    CWD_HOME_CURRENT => PromptEscape::CwdHomeCurrent,
    CWD_HOME_PARENTS => PromptEscape::CwdHomeParents,
    START_FG_COLOR LBRACE <a: Argument> RBRACE => PromptEscape::FGColorStart(a),
    END_FG_COLOR => PromptEscape::FGColorEnd,
    START_BG_COLOR LBRACE <a: Argument> RBRACE => PromptEscape::BGColorStart(a),
    END_BG_COLOR => PromptEscape::BGColorEnd,
    GIT => PromptEscape::Git,
}

Argument: Argument = {
    <w: WORD> => Argument::Word(String::from(w)),
    <n: U8> => Argument::Number(n),
}