44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
|
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)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|