use super::{Repl, InterpreterDirectiveOutput}; use crate::language::{LangMetaRequest, LangMetaResponse, DebugAsk, DebugResponse}; use itertools::Itertools; use std::fmt::Write as FmtWrite; #[derive(Debug, Clone)] pub enum DirectiveAction { Null, Help, QuitProgram, ListPasses, } impl DirectiveAction { pub fn perform(&self, repl: &mut Repl, arguments: &[&str]) -> InterpreterDirectiveOutput { use DirectiveAction::*; match self { Null => None, Help => Some(repl.print_help_message(arguments)), QuitProgram => { repl.save_before_exit(); ::std::process::exit(0) }, ListPasses => { let language_state = repl.get_cur_language_state(); let pass_names = match language_state.request_meta(LangMetaRequest::StageNames) { LangMetaResponse::StageNames(names) => names, _ => vec![], }; let mut buf = String::new(); for pass in pass_names.iter().map(|name| Some(name)).intersperse(None) { match pass { Some(pass) => write!(buf, "{}", pass).unwrap(), None => write!(buf, " -> ").unwrap(), } } Some(buf) } } } }