From e42ddda5a6d46af8556c2f22711e9bd1d820d223 Mon Sep 17 00:00:00 2001 From: sharkdp Date: Fri, 3 Apr 2020 10:48:27 +0200 Subject: [PATCH] Clean up exit code handling --- src/exec/job.rs | 2 +- src/exit_codes.rs | 39 ++++++++++++++++++++++++++------------- src/walk.rs | 2 +- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/exec/job.rs b/src/exec/job.rs index 9d9ce3a..eafb0cd 100644 --- a/src/exec/job.rs +++ b/src/exec/job.rs @@ -38,7 +38,7 @@ pub fn job( results.push(cmd.generate_and_execute(&value, Arc::clone(&out_perm))) } // Returns error in case of any error. - merge_exitcodes(results) + merge_exitcodes(&results) } pub fn batch( diff --git a/src/exit_codes.rs b/src/exit_codes.rs index c0be96b..96bce96 100644 --- a/src/exit_codes.rs +++ b/src/exit_codes.rs @@ -1,4 +1,4 @@ -#[derive(PartialEq, Debug)] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum ExitCode { Success, GeneralError, @@ -17,14 +17,11 @@ impl Into for ExitCode { impl ExitCode { fn is_error(&self) -> bool { - match self { - ExitCode::GeneralError | ExitCode::KilledBySigint => true, - _ => false, - } + *self != ExitCode::Success } } -pub fn merge_exitcodes(results: Vec) -> ExitCode { +pub fn merge_exitcodes(results: &[ExitCode]) -> ExitCode { if results.iter().any(ExitCode::is_error) { return ExitCode::GeneralError; } @@ -36,24 +33,40 @@ mod tests { use super::*; #[test] - fn success_with_empty_vec() { - assert_eq!(merge_exitcodes(vec![]), ExitCode::Success); + fn success_when_no_results() { + assert_eq!(merge_exitcodes(&[]), ExitCode::Success); } #[test] - fn general_error_with_at_least_a_matching_error() { + fn general_error_if_at_least_one_error() { assert_eq!( - merge_exitcodes(vec![ExitCode::KilledBySigint, ExitCode::Success]), + merge_exitcodes(&[ExitCode::GeneralError]), ExitCode::GeneralError ); assert_eq!( - merge_exitcodes(vec![ExitCode::GeneralError, ExitCode::Success]), + merge_exitcodes(&[ExitCode::KilledBySigint]), + ExitCode::GeneralError + ); + assert_eq!( + merge_exitcodes(&[ExitCode::KilledBySigint, ExitCode::Success]), + ExitCode::GeneralError + ); + assert_eq!( + merge_exitcodes(&[ExitCode::Success, ExitCode::GeneralError]), + ExitCode::GeneralError + ); + assert_eq!( + merge_exitcodes(&[ExitCode::GeneralError, ExitCode::KilledBySigint]), ExitCode::GeneralError ); } #[test] - fn success_with_no_error() { - assert_eq!(merge_exitcodes(vec![ExitCode::Success]), ExitCode::Success); + fn success_if_no_error() { + assert_eq!(merge_exitcodes(&[ExitCode::Success]), ExitCode::Success); + assert_eq!( + merge_exitcodes(&[ExitCode::Success, ExitCode::Success]), + ExitCode::Success + ); } } diff --git a/src/walk.rs b/src/walk.rs index faf7c4c..0d3d859 100644 --- a/src/walk.rs +++ b/src/walk.rs @@ -173,7 +173,7 @@ fn spawn_receiver( results.push(h.join().unwrap()); } - merge_exitcodes(results) + merge_exitcodes(&results) } } else { let start = time::Instant::now();