Moving options around

Showing time
This commit is contained in:
greg 2019-05-21 02:46:07 -07:00
parent 2b407a4a83
commit eb2adb5b79
4 changed files with 28 additions and 25 deletions

View File

@ -267,8 +267,7 @@ impl ProgrammingLanguageInterface for Schala {
.and_then(|ast| ast_reducing(ast, self, reducing_debug_artifact)) .and_then(|ast| ast_reducing(ast, self, reducing_debug_artifact))
.and_then(|reduced_ast| eval(reduced_ast, self, eval_debug_artifact)); .and_then(|reduced_ast| eval(reduced_ast, self, eval_debug_artifact));
let total_duration = Some(sw.elapsed()); let total_duration = sw.elapsed();
let global_output_stats = GlobalOutputStats { let global_output_stats = GlobalOutputStats {
total_duration, stage_durations: None, total_duration, stage_durations: None,
}; };

View File

@ -30,7 +30,7 @@ pub struct ComputationResponse {
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct GlobalOutputStats { pub struct GlobalOutputStats {
pub total_duration: Option<time::Duration>, pub total_duration: time::Duration,
pub stage_durations: Option<Vec<(String, time::Duration)>> pub stage_durations: Option<Vec<(String, time::Duration)>>
} }

View File

@ -1,6 +1,5 @@
use std::fmt::Write as FmtWrite; use std::fmt::Write as FmtWrite;
use std::sync::Arc; use std::sync::Arc;
use std::collections::HashSet;
use colored::*; use colored::*;
use itertools::Itertools; use itertools::Itertools;
@ -12,7 +11,7 @@ DebugRequest, DebugAsk, DebugResponse};
mod command_tree; mod command_tree;
use self::command_tree::{CommandTree, BoxedCommandFunction}; use self::command_tree::{CommandTree, BoxedCommandFunction};
mod repl_options; mod repl_options;
use repl_options::SaveOptions; use repl_options::ReplOptions;
const HISTORY_SAVE_FILE: &'static str = ".schala_history"; const HISTORY_SAVE_FILE: &'static str = ".schala_history";
const OPTIONS_SAVE_FILE: &'static str = ".schala_repl"; const OPTIONS_SAVE_FILE: &'static str = ".schala_repl";
@ -21,7 +20,7 @@ pub struct Repl {
interpreter_directive_sigil: char, interpreter_directive_sigil: char,
line_reader: ::linefeed::interface::Interface<::linefeed::terminal::DefaultTerminal>, line_reader: ::linefeed::interface::Interface<::linefeed::terminal::DefaultTerminal>,
language_states: Vec<Box<ProgrammingLanguageInterface>>, language_states: Vec<Box<ProgrammingLanguageInterface>>,
debug_asks: HashSet<DebugAsk>, options: ReplOptions,
} }
impl Repl { impl Repl {
@ -34,7 +33,7 @@ impl Repl {
interpreter_directive_sigil, interpreter_directive_sigil,
line_reader, line_reader,
language_states: initial_states, language_states: initial_states,
debug_asks: HashSet::new(), options: ReplOptions::new(),
} }
} }
@ -49,9 +48,9 @@ impl Repl {
fn load_options(&mut self) { fn load_options(&mut self) {
self.line_reader.load_history(HISTORY_SAVE_FILE).unwrap_or(()); self.line_reader.load_history(HISTORY_SAVE_FILE).unwrap_or(());
match SaveOptions::load_from_file(OPTIONS_SAVE_FILE) { match ReplOptions::load_from_file(OPTIONS_SAVE_FILE) {
Ok(options) => { Ok(options) => {
self.debug_asks = options.debug_asks; self.options = options;
}, },
Err(()) => () Err(()) => ()
}; };
@ -91,10 +90,7 @@ impl Repl {
fn save_before_exit(&self) { fn save_before_exit(&self) {
self.line_reader.save_history(HISTORY_SAVE_FILE).unwrap_or(()); self.line_reader.save_history(HISTORY_SAVE_FILE).unwrap_or(());
let options = SaveOptions { self.options.save_to_file(OPTIONS_SAVE_FILE);
debug_asks: self.debug_asks.clone()
};
options.save_to_file(OPTIONS_SAVE_FILE);
} }
fn get_function_from_directives<'a>(directives: &'a CommandTree, commands: &Vec<&str>) -> Result<(&'a BoxedCommandFunction, usize), String> { fn get_function_from_directives<'a>(directives: &'a CommandTree, commands: &Vec<&str>) -> Result<(&'a BoxedCommandFunction, usize), String> {
@ -179,7 +175,7 @@ impl Repl {
fn handle_input(&mut self, input: &str) -> String { fn handle_input(&mut self, input: &str) -> String {
let mut debug_requests = vec![]; let mut debug_requests = vec![];
for ask in self.debug_asks.iter() { for ask in self.options.debug_asks.iter() {
debug_requests.push(DebugRequest { ask: ask.clone() }); debug_requests.push(DebugRequest { ask: ask.clone() });
} }
@ -197,8 +193,8 @@ impl Repl {
fn handle_computation_response(&mut self, response: ComputationResponse) -> String { fn handle_computation_response(&mut self, response: ComputationResponse) -> String {
let mut buf = String::new(); let mut buf = String::new();
if let Some(total_duration) = response.global_output_stats.total_duration { if self.options.show_total_time {
buf.push_str(&format!("Total duration: {:?}\n", total_duration)); buf.push_str(&format!("Total duration: {:?}\n", response.global_output_stats.total_duration));
} }
buf.push_str(&match response.main_output { buf.push_str(&match response.main_output {
@ -288,16 +284,16 @@ impl Repl {
}; };
let ask = DebugAsk::ByStage { stage_name }; let ask = DebugAsk::ByStage { stage_name };
if cmd == Some(&"show") { if cmd == Some(&"show") {
repl.debug_asks.insert(ask); repl.options.debug_asks.insert(ask);
} else { } else {
repl.debug_asks.remove(&ask); repl.options.debug_asks.remove(&ask);
} }
None None
}, },
Some(&"timing") => { Some(&"timing") => {
match cmds.get(1) { match cmds.get(1) {
Some(&"on") => repl.debug_asks.insert(DebugAsk::Timing), Some(&"on") => repl.options.debug_asks.insert(DebugAsk::Timing),
Some(&"off") => repl.debug_asks.remove(&DebugAsk::Timing), Some(&"off") => repl.options.debug_asks.remove(&DebugAsk::Timing),
_ => return Some(format!("Must specify 'on' or 'off'")), _ => return Some(format!("Must specify 'on' or 'off'")),
}; };
None None

View File

@ -5,11 +5,19 @@ use std::collections::HashSet;
use std::fs::File; use std::fs::File;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct SaveOptions { pub struct ReplOptions {
pub debug_asks: HashSet<DebugAsk> pub debug_asks: HashSet<DebugAsk>,
pub show_total_time: bool,
}
impl ReplOptions {
pub fn new() -> ReplOptions {
ReplOptions {
debug_asks: HashSet::new(),
show_total_time: true,
}
} }
impl SaveOptions {
pub fn save_to_file(&self, filename: &str) { pub fn save_to_file(&self, filename: &str) {
let res = File::create(filename) let res = File::create(filename)
.and_then(|mut file| { .and_then(|mut file| {
@ -21,7 +29,7 @@ impl SaveOptions {
} }
} }
pub fn load_from_file(filename: &str) -> Result<SaveOptions, ()> { pub fn load_from_file(filename: &str) -> Result<ReplOptions, ()> {
File::open(filename) File::open(filename)
.and_then(|mut file| { .and_then(|mut file| {
let mut contents = String::new(); let mut contents = String::new();
@ -29,7 +37,7 @@ impl SaveOptions {
Ok(contents) Ok(contents)
}) })
.and_then(|contents| { .and_then(|contents| {
let output: SaveOptions = crate::serde_json::from_str(&contents)?; let output: ReplOptions = crate::serde_json::from_str(&contents)?;
Ok(output) Ok(output)
}) })
.map_err(|_| ()) .map_err(|_| ())