Files
artcraft/crates/lib/subprocess_common/src/command_exit_status.rs
T

83 lines
3.0 KiB
Rust

use subprocess::ExitStatus;
#[derive(Clone, Eq, PartialEq, Debug)]
pub enum CommandExitStatus {
/// Process was executed and completed successfully
Success,
/// Process was executed and returned a failure (non-zero) exit code
Failure,
/// Process executed, but was terminated early for going over the timeout threshold.
Timeout,
/// Process was executed, but encountered some unknown other status.
Unknown,
/// Process could not be run due to some other condition.
FailureWithReason { reason: String },
}
impl CommandExitStatus {
pub fn from_exit_status(exit_status: ExitStatus) -> Self {
match exit_status {
ExitStatus::Exited(0) => CommandExitStatus::Success,
ExitStatus::Exited(1) => CommandExitStatus::Failure,
ExitStatus::Exited(_other_exit_code) => CommandExitStatus::Failure,
ExitStatus::Signaled(_) => CommandExitStatus::Unknown,
ExitStatus::Other(_) => CommandExitStatus::Unknown,
ExitStatus::Undetermined => CommandExitStatus::Unknown,
}
}
pub fn is_success(&self) -> bool {
match self {
CommandExitStatus::Success => true,
CommandExitStatus::Failure => false,
CommandExitStatus::Timeout => false,
CommandExitStatus::Unknown => false,
CommandExitStatus::FailureWithReason { .. } => false,
}
}
}
#[cfg(test)]
mod tests {
use subprocess::ExitStatus;
use crate::command_exit_status::CommandExitStatus;
#[test]
fn is_success() {
assert_eq!(CommandExitStatus::Success.is_success(), true);
assert_eq!(CommandExitStatus::Failure.is_success(), false);
assert_eq!(CommandExitStatus::Timeout.is_success(), false);
assert_eq!(CommandExitStatus::Unknown.is_success(), false);
assert_eq!(CommandExitStatus::FailureWithReason{ reason: "foo".to_string() }.is_success(), false);
}
#[test]
fn from_exit_status() {
// Success
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Exited(0)), CommandExitStatus::Success);
// Linux process failure codes
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Exited(1)), CommandExitStatus::Failure);
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Exited(2)), CommandExitStatus::Failure);
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Exited(100)), CommandExitStatus::Failure);
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Exited(255)), CommandExitStatus::Failure);
// Process signal codes
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Signaled(0)), CommandExitStatus::Unknown);
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Signaled(1)), CommandExitStatus::Unknown);
// Process signal codes
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Other(0)), CommandExitStatus::Unknown);
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Other(1)), CommandExitStatus::Unknown);
// Unknown
assert_eq!(CommandExitStatus::from_exit_status(ExitStatus::Undetermined), CommandExitStatus::Unknown);
}
}