#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(crate) enum Code {
Success = 0,
Failure = 1,
Usage = 2,
Partial = 3,
Interrupted = 130,
}
impl Code {
#[must_use]
pub(crate) fn as_u8(self) -> u8 {
self as u8
}
}
impl From<Code> for std::process::ExitCode {
fn from(code: Code) -> Self {
Self::from(code.as_u8())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(crate) enum Outcome {
Complete,
Partial,
Interrupted,
}
impl Outcome {
#[must_use]
pub(crate) fn code(self) -> Code {
match self {
Outcome::Complete => Code::Success,
Outcome::Partial => Code::Partial,
Outcome::Interrupted => Code::Interrupted,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_documented_numbers_are_the_numbers() {
assert_eq!(Code::Success.as_u8(), 0);
assert_eq!(Code::Failure.as_u8(), 1);
assert_eq!(Code::Usage.as_u8(), 2);
assert_eq!(Code::Partial.as_u8(), 3);
assert_eq!(Code::Interrupted.as_u8(), 130);
}
#[test]
fn every_outcome_has_the_status_it_claims() {
assert_eq!(Outcome::Complete.code(), Code::Success);
assert_eq!(Outcome::Partial.code(), Code::Partial);
assert_eq!(Outcome::Interrupted.code(), Code::Interrupted);
}
#[test]
fn interruption_is_the_shells_own_number_for_it() {
const SIGINT: u8 = 2;
assert_eq!(Code::Interrupted.as_u8(), 128 + SIGINT);
}
}