From 5564407a979e2f9f465cf7ed02b9806840aef769 Mon Sep 17 00:00:00 2001 From: Jordi Chauzi Date: Sun, 9 May 2021 18:20:59 +0200 Subject: [PATCH] Store exit codes as Options (and remove unwrapping) --- src/hyperfine/benchmark.rs | 14 +-- src/hyperfine/export/asciidoc.rs | 12 +-- src/hyperfine/export/csv.rs | 4 +- src/hyperfine/export/markdown.rs | 160 +++++++++++++++---------------- src/hyperfine/types.rs | 4 +- 5 files changed, 95 insertions(+), 99 deletions(-) diff --git a/src/hyperfine/benchmark.rs b/src/hyperfine/benchmark.rs index 9eb8a49..050d9ca 100644 --- a/src/hyperfine/benchmark.rs +++ b/src/hyperfine/benchmark.rs @@ -202,23 +202,19 @@ fn run_cleanup_command( } #[cfg(unix)] -fn extract_exit_code(status: ExitStatus) -> i32 { +fn extract_exit_code(status: ExitStatus) -> Option { use std::os::unix::process::ExitStatusExt; /* From the ExitStatus::code documentation: "On Unix, this will return None if the process was terminated by a signal." In that case, ExitStatusExt::signal should never return None. */ - status.code().unwrap_or_else(|| status.signal().unwrap()) + status.code().or_else(|| status.signal()) } #[cfg(not(unix))] -fn extract_exit_code(status: ExitStatus) -> i32 { - /* From the ExitStatus::code documentation: - "On Unix, this will return None if the process was terminated by a signal." - On the other configurations, ExitStatus::code should never return None. - */ - status.code().unwrap() +fn extract_exit_code(status: ExitStatus) -> Option { + status.code() } /// Run the benchmark for a single shell command @@ -248,7 +244,7 @@ pub fn run_benchmark( let mut times_real: Vec = vec![]; let mut times_user: Vec = vec![]; let mut times_system: Vec = vec![]; - let mut exit_codes: Vec = vec![]; + let mut exit_codes: Vec> = vec![]; let mut all_succeeded = true; // Run init command diff --git a/src/hyperfine/export/asciidoc.rs b/src/hyperfine/export/asciidoc.rs index 0a7bd06..08623bf 100644 --- a/src/hyperfine/export/asciidoc.rs +++ b/src/hyperfine/export/asciidoc.rs @@ -99,8 +99,8 @@ fn test_asciidoc_table_row() { 0.10745223440000001, 0.10697327940000001, ], - vec![0, 0, 0], // exit codes - BTreeMap::new(), // param + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // param ); let expms = format!( @@ -152,8 +152,8 @@ fn test_asciidoc_table_row_command_escape() { 0.10745223440000001, 0.10697327940000001, ], - vec![0, 0, 0], // exit codes - BTreeMap::new(), // param + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // param ); let exps = format!( "| `sleep 1\\|`\n\ @@ -187,7 +187,7 @@ fn test_asciidoc() { 5.0, 6.0, vec![7.0, 8.0, 9.0], - vec![0, 0, 0], + vec![Some(0), Some(0), Some(0)], { let mut params = BTreeMap::new(); params.insert("foo".into(), "1".into()); @@ -205,7 +205,7 @@ fn test_asciidoc() { 15.0, 16.0, vec![17.0, 18.0, 19.0], - vec![0, 0, 0], + vec![Some(0), Some(0), Some(0)], { let mut params = BTreeMap::new(); params.insert("foo".into(), "1".into()); diff --git a/src/hyperfine/export/csv.rs b/src/hyperfine/export/csv.rs index ef2c382..ef2cc23 100644 --- a/src/hyperfine/export/csv.rs +++ b/src/hyperfine/export/csv.rs @@ -68,7 +68,7 @@ fn test_csv() { 5.0, 6.0, vec![7.0, 8.0, 9.0], - vec![0, 0, 0], + vec![Some(0), Some(0), Some(0)], { let mut params = BTreeMap::new(); params.insert("foo".into(), "one".into()); @@ -86,7 +86,7 @@ fn test_csv() { 15.0, 16.5, vec![17.0, 18.0, 19.0], - vec![0, 0, 0], + vec![Some(0), Some(0), Some(0)], { let mut params = BTreeMap::new(); params.insert("foo".into(), "one".into()); diff --git a/src/hyperfine/export/markdown.rs b/src/hyperfine/export/markdown.rs index a21a815..3d7a2e2 100644 --- a/src/hyperfine/export/markdown.rs +++ b/src/hyperfine/export/markdown.rs @@ -94,30 +94,30 @@ fn test_markdown_format_ms() { timing_results.push(BenchmarkResult::new( String::from("sleep 0.1"), - 0.1057, // mean - 0.0016, // std dev - 0.1057, // median - 0.0009, // user_mean - 0.0011, // system_mean - 0.1023, // min - 0.1080, // max - vec![0.1, 0.1, 0.1], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 0.1057, // mean + 0.0016, // std dev + 0.1057, // median + 0.0009, // user_mean + 0.0011, // system_mean + 0.1023, // min + 0.1080, // max + vec![0.1, 0.1, 0.1], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); timing_results.push(BenchmarkResult::new( String::from("sleep 2"), - 2.0050, // mean - 0.0020, // std dev - 2.0050, // median - 0.0009, // user_mean - 0.0012, // system_mean - 2.0020, // min - 2.0080, // max - vec![2.0, 2.0, 2.0], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 2.0050, // mean + 0.0020, // std dev + 2.0050, // median + 0.0009, // user_mean + 0.0012, // system_mean + 2.0020, // min + 2.0080, // max + vec![2.0, 2.0, 2.0], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); let formatted = String::from_utf8(exporter.serialize(&timing_results, None).unwrap()).unwrap(); @@ -144,30 +144,30 @@ fn test_markdown_format_s() { timing_results.push(BenchmarkResult::new( String::from("sleep 2"), - 2.0050, // mean - 0.0020, // std dev - 2.0050, // median - 0.0009, // user_mean - 0.0012, // system_mean - 2.0020, // min - 2.0080, // max - vec![2.0, 2.0, 2.0], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 2.0050, // mean + 0.0020, // std dev + 2.0050, // median + 0.0009, // user_mean + 0.0012, // system_mean + 2.0020, // min + 2.0080, // max + vec![2.0, 2.0, 2.0], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); timing_results.push(BenchmarkResult::new( String::from("sleep 0.1"), - 0.1057, // mean - 0.0016, // std dev - 0.1057, // median - 0.0009, // user_mean - 0.0011, // system_mean - 0.1023, // min - 0.1080, // max - vec![0.1, 0.1, 0.1], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 0.1057, // mean + 0.0016, // std dev + 0.1057, // median + 0.0009, // user_mean + 0.0011, // system_mean + 0.1023, // min + 0.1080, // max + vec![0.1, 0.1, 0.1], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); let formatted = String::from_utf8(exporter.serialize(&timing_results, None).unwrap()).unwrap(); @@ -193,30 +193,30 @@ fn test_markdown_format_time_unit_s() { timing_results.push(BenchmarkResult::new( String::from("sleep 0.1"), - 0.1057, // mean - 0.0016, // std dev - 0.1057, // median - 0.0009, // user_mean - 0.0011, // system_mean - 0.1023, // min - 0.1080, // max - vec![0.1, 0.1, 0.1], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 0.1057, // mean + 0.0016, // std dev + 0.1057, // median + 0.0009, // user_mean + 0.0011, // system_mean + 0.1023, // min + 0.1080, // max + vec![0.1, 0.1, 0.1], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); timing_results.push(BenchmarkResult::new( String::from("sleep 2"), - 2.0050, // mean - 0.0020, // std dev - 2.0050, // median - 0.0009, // user_mean - 0.0012, // system_mean - 2.0020, // min - 2.0080, // max - vec![2.0, 2.0, 2.0], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 2.0050, // mean + 0.0020, // std dev + 2.0050, // median + 0.0009, // user_mean + 0.0012, // system_mean + 2.0020, // min + 2.0080, // max + vec![2.0, 2.0, 2.0], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); let formatted = String::from_utf8( @@ -248,30 +248,30 @@ fn test_markdown_format_time_unit_ms() { timing_results.push(BenchmarkResult::new( String::from("sleep 2"), - 2.0050, // mean - 0.0020, // std dev - 2.0050, // median - 0.0009, // user_mean - 0.0012, // system_mean - 2.0020, // min - 2.0080, // max - vec![2.0, 2.0, 2.0], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 2.0050, // mean + 0.0020, // std dev + 2.0050, // median + 0.0009, // user_mean + 0.0012, // system_mean + 2.0020, // min + 2.0080, // max + vec![2.0, 2.0, 2.0], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); timing_results.push(BenchmarkResult::new( String::from("sleep 0.1"), - 0.1057, // mean - 0.0016, // std dev - 0.1057, // median - 0.0009, // user_mean - 0.0011, // system_mean - 0.1023, // min - 0.1080, // max - vec![0.1, 0.1, 0.1], // times - vec![0, 0, 0], // exit codes - BTreeMap::new(), // parameter + 0.1057, // mean + 0.0016, // std dev + 0.1057, // median + 0.0009, // user_mean + 0.0011, // system_mean + 0.1023, // min + 0.1080, // max + vec![0.1, 0.1, 0.1], // times + vec![Some(0), Some(0), Some(0)], // exit codes + BTreeMap::new(), // parameter )); let formatted = String::from_utf8( diff --git a/src/hyperfine/types.rs b/src/hyperfine/types.rs index dd792e3..850a541 100644 --- a/src/hyperfine/types.rs +++ b/src/hyperfine/types.rs @@ -269,7 +269,7 @@ pub struct BenchmarkResult { pub times: Option>, /// All run exit codes - pub exit_codes: Vec, + pub exit_codes: Vec>, /// Any parameter values used #[serde(skip_serializing_if = "BTreeMap::is_empty")] @@ -288,7 +288,7 @@ impl BenchmarkResult { min: Second, max: Second, times: Vec, - exit_codes: Vec, + exit_codes: Vec>, parameters: BTreeMap, ) -> Self { BenchmarkResult {