diff --git a/schala-repl/src/repl/command_tree.rs b/schala-repl/src/repl/command_tree.rs new file mode 100644 index 0000000..e742c1d --- /dev/null +++ b/schala-repl/src/repl/command_tree.rs @@ -0,0 +1,43 @@ + +#[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 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(), + } + } +} diff --git a/schala-repl/src/repl.rs b/schala-repl/src/repl/mod.rs similarity index 90% rename from schala-repl/src/repl.rs rename to schala-repl/src/repl/mod.rs index a184c43..1d81c59 100644 --- a/schala-repl/src/repl.rs +++ b/schala-repl/src/repl/mod.rs @@ -7,6 +7,8 @@ use colored::*; use itertools::Itertools; use language::{ProgrammingLanguageInterface, EvalOptions, PassDebugOptionsDescriptor}; +mod command_tree; +use self::command_tree::CommandTree; const HISTORY_SAVE_FILE: &'static str = ".schala_history"; const OPTIONS_SAVE_FILE: &'static str = ".schala_repl"; @@ -164,12 +166,12 @@ impl Repl { .split_whitespace() .collect(); - let cmd: &str = match commands.get(0).clone() { + let initial_cmd: &str = match commands.get(0).clone() { None => return None, Some(s) => s }; - match cmd { + match initial_cmd { "exit" | "quit" => { self.save_options(); ::std::process::exit(0) @@ -348,46 +350,3 @@ impl Completer for TabCompleteHandler { } } } - -#[derive(Clone)] -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 { - fn term(s: &str, help: Option<&str>) -> CommandTree { - CommandTree::Terminal {name: s.to_string(), help_msg: help.map(|x| x.to_string()), function: None } - } - fn get_cmd(&self) -> &str { - match self { - CommandTree::Terminal { name, .. } => name.as_str(), - CommandTree::NonTerminal {name, ..} => name.as_str(), - CommandTree::Top(_) => "", - } - } - 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(_) => "" - } - } - 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(), - } - } -}