use std::fmt::Write as FmtWrite; use colored::*; use super::command_tree::CommandTree; use super::{Repl, InterpreterDirectiveOutput}; pub fn help(repl: &mut Repl, arguments: &[&str]) -> InterpreterDirectiveOutput { match arguments { [] => return global_help(repl), commands => { let dirs = repl.get_directives(); Some(match get_directive_from_commands(commands, &dirs) { None => format!("Directive `{}` not found", commands.last().unwrap()), Some(dir) => { let mut buf = String::new(); let cmd = dir.get_cmd(); let children = dir.get_children(); writeln!(buf, "`{}` - {}", cmd, dir.get_help()).unwrap(); for sub in children.iter() { writeln!(buf, "\t`{} {}` - {}", cmd, sub.get_cmd(), sub.get_help()).unwrap(); } buf } }) } } } fn get_directive_from_commands<'a>(commands: &[&str], dirs: &'a CommandTree) -> Option<&'a CommandTree> { let mut directive_list = dirs.get_children(); let mut matched_directive = None; for cmd in commands { let found = directive_list.iter().find(|directive| directive.get_cmd() == *cmd); if let Some(dir) = found { directive_list = dir.get_children(); } matched_directive = found; } matched_directive } fn global_help(repl: &mut Repl) -> InterpreterDirectiveOutput { let mut buf = String::new(); let sigil = repl.interpreter_directive_sigil; writeln!(buf, "{} version {}", "Schala REPL".bright_red().bold(), crate::VERSION_STRING).unwrap(); writeln!(buf, "-----------------------").unwrap(); for directive in repl.get_directives().get_children() { writeln!(buf, "{}{} - {}", sigil, directive.get_cmd(), directive.get_help()).unwrap(); } let ref lang = repl.get_cur_language_state(); writeln!(buf, "").unwrap(); writeln!(buf, "Language-specific help for {}", lang.get_language_name()).unwrap(); writeln!(buf, "-----------------------").unwrap(); Some(buf) }