Slight refactor of REPL code

In preparation for multi-line REPL input
This commit is contained in:
greg 2019-02-02 00:24:59 -08:00
parent f3f1dcc0a4
commit 3256935946

View File

@ -33,7 +33,7 @@ impl Repl {
languages, languages,
current_language_index, current_language_index,
interpreter_directive_sigil: ':', interpreter_directive_sigil: ':',
line_reader line_reader,
} }
} }
@ -90,16 +90,7 @@ impl Repl {
}, },
Ok(ReadResult::Eof) => break, Ok(ReadResult::Eof) => break,
Ok(ReadResult::Signal(_)) => break, Ok(ReadResult::Signal(_)) => break,
Ok(ReadResult::Input(ref input)) => { Ok(ReadResult::Input(input)) => self.input_loop(input),
self.line_reader.add_history_unique(input.to_string());
let output = match input.chars().nth(0) {
Some(ch) if ch == self.interpreter_directive_sigil => self.handle_interpreter_directive(input),
_ => Some(self.input_handler(input)),
};
if let Some(o) = output {
println!("=> {}", o);
}
}
} }
} }
self.line_reader.save_history(HISTORY_SAVE_FILE).unwrap_or(()); self.line_reader.save_history(HISTORY_SAVE_FILE).unwrap_or(());
@ -107,6 +98,23 @@ impl Repl {
println!("Exiting..."); println!("Exiting...");
} }
fn input_loop(&mut self, input: String) {
if input == "" {
return;
}
if input.chars().nth(0).unwrap() == self.interpreter_directive_sigil {
if let Some(output) = self.handle_interpreter_directive(&input) {
println!("{}", output);
}
return;
}
let output = self.input_handler(&input);
self.line_reader.add_history_unique(input.clone());
println!("=> {}", output);
}
fn input_handler(&mut self, input: &str) -> String { fn input_handler(&mut self, input: &str) -> String {
let ref mut language = self.languages[self.current_language_index]; let ref mut language = self.languages[self.current_language_index];
let interpreter_output = language.execute_pipeline(input, &self.options); let interpreter_output = language.execute_pipeline(input, &self.options);