fd/src/exit_codes.rs

73 lines
1.7 KiB
Rust
Raw Normal View History

2020-04-03 10:48:27 +02:00
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ExitCode {
Success,
GeneralError,
KilledBySigint,
}
impl Into<i32> for ExitCode {
fn into(self) -> i32 {
match self {
2020-02-22 08:55:32 +01:00
ExitCode::Success => 0,
ExitCode::GeneralError => 1,
ExitCode::KilledBySigint => 130,
}
}
}
impl ExitCode {
2020-02-22 09:01:52 +01:00
fn is_error(&self) -> bool {
2020-04-03 10:48:27 +02:00
*self != ExitCode::Success
2020-02-22 09:01:52 +01:00
}
}
2020-04-03 10:48:27 +02:00
pub fn merge_exitcodes(results: &[ExitCode]) -> ExitCode {
if results.iter().any(ExitCode::is_error) {
return ExitCode::GeneralError;
}
ExitCode::Success
}
2020-02-22 10:39:03 +01:00
#[cfg(test)]
mod tests {
use super::*;
#[test]
2020-04-03 10:48:27 +02:00
fn success_when_no_results() {
assert_eq!(merge_exitcodes(&[]), ExitCode::Success);
2020-02-22 10:39:03 +01:00
}
#[test]
2020-04-03 10:48:27 +02:00
fn general_error_if_at_least_one_error() {
2020-02-22 10:39:03 +01:00
assert_eq!(
2020-04-03 10:48:27 +02:00
merge_exitcodes(&[ExitCode::GeneralError]),
2020-02-22 10:39:03 +01:00
ExitCode::GeneralError
);
assert_eq!(
2020-04-03 10:48:27 +02:00
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]),
2020-02-22 10:39:03 +01:00
ExitCode::GeneralError
);
}
#[test]
2020-04-03 10:48:27 +02:00
fn success_if_no_error() {
assert_eq!(merge_exitcodes(&[ExitCode::Success]), ExitCode::Success);
assert_eq!(
merge_exitcodes(&[ExitCode::Success, ExitCode::Success]),
ExitCode::Success
);
2020-02-22 10:39:03 +01:00
}
}