44 lines
1.3 KiB
Rust
44 lines
1.3 KiB
Rust
|
|
||
|
#[derive(Clone)]
|
||
|
pub enum CommandTree {
|
||
|
Terminal {
|
||
|
name: String,
|
||
|
help_msg: Option<String>,
|
||
|
function: Option<Box<(fn() -> Option<String>)>>,
|
||
|
},
|
||
|
NonTerminal {
|
||
|
name: String,
|
||
|
children: Vec<CommandTree>,
|
||
|
help_msg: Option<String>,
|
||
|
function: Option<Box<(fn() -> Option<String>)>>,
|
||
|
},
|
||
|
Top(Vec<CommandTree>),
|
||
|
}
|
||
|
|
||
|
impl CommandTree {
|
||
|
pub fn term(s: &str, help: Option<&str>) -> CommandTree {
|
||
|
CommandTree::Terminal {name: s.to_string(), help_msg: help.map(|x| x.to_string()), function: None }
|
||
|
}
|
||
|
pub fn get_cmd(&self) -> &str {
|
||
|
match self {
|
||
|
CommandTree::Terminal { name, .. } => name.as_str(),
|
||
|
CommandTree::NonTerminal {name, ..} => name.as_str(),
|
||
|
CommandTree::Top(_) => "",
|
||
|
}
|
||
|
}
|
||
|
pub fn get_help(&self) -> &str {
|
||
|
match self {
|
||
|
CommandTree::Terminal { help_msg, ..} => help_msg.as_ref().map(|s| s.as_str()).unwrap_or(""),
|
||
|
CommandTree::NonTerminal { help_msg, .. } => help_msg.as_ref().map(|s| s.as_str()).unwrap_or(""),
|
||
|
CommandTree::Top(_) => ""
|
||
|
}
|
||
|
}
|
||
|
pub fn get_children(&self) -> Vec<&str> {
|
||
|
match self {
|
||
|
CommandTree::Terminal { .. } => vec![],
|
||
|
CommandTree::NonTerminal { children, .. } => children.iter().map(|x| x.get_cmd()).collect(),
|
||
|
CommandTree::Top(children) => children.iter().map(|x| x.get_cmd()).collect(),
|
||
|
}
|
||
|
}
|
||
|
}
|