#[derive(Clone)] pub enum CommandTree { Terminal { name: String, help_msg: Option, function: Option Option)>>, }, NonTerminal { name: String, children: Vec, help_msg: Option, function: Option Option)>>, }, Top(Vec), } 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 nonterm(s: &str, help: Option<&str>, children: Vec) -> CommandTree { CommandTree::NonTerminal { name: s.to_string(), help_msg: help.map(|x| x.to_string()), children, 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(), } } }