#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[repr(u8)]
pub enum ExitCode {
Ok = 0,
SnapshotDiffOrUnexpected = 1,
SnapshotMissing = 2,
Timeout = 3,
MemoryExhausted = 4,
WorkerCrashed = 5,
SnapshotDiffTooLarge = 6,
MalformedDiagnostic = 7,
CleanupResidue = 8,
ConfigInvalid = 64,
DylibBuildFailed = 65,
DylibNotFound = 66,
ToolchainDrift = 67,
}
impl ExitCode {
pub fn merge(self, other: ExitCode) -> ExitCode {
if (self as u8) >= (other as u8) {
self
} else {
other
}
}
pub fn name(self) -> &'static str {
match self {
Self::Ok => "OK",
Self::SnapshotDiffOrUnexpected => "SNAPSHOT_DIFF_OR_UNEXPECTED",
Self::SnapshotMissing => "SNAPSHOT_MISSING",
Self::Timeout => "TIMEOUT",
Self::MemoryExhausted => "MEMORY_EXHAUSTED",
Self::WorkerCrashed => "WORKER_CRASHED",
Self::SnapshotDiffTooLarge => "SNAPSHOT_DIFF_TOO_LARGE",
Self::MalformedDiagnostic => "MALFORMED_DIAGNOSTIC",
Self::CleanupResidue => "CLEANUP_RESIDUE",
Self::ConfigInvalid => "CONFIG_INVALID",
Self::DylibBuildFailed => "DYLIB_BUILD_FAILED",
Self::DylibNotFound => "DYLIB_NOT_FOUND",
Self::ToolchainDrift => "TOOLCHAIN_DRIFT",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn spec_numbering_is_stable() {
assert_eq!(ExitCode::Ok as u8, 0);
assert_eq!(ExitCode::SnapshotDiffOrUnexpected as u8, 1);
assert_eq!(ExitCode::SnapshotMissing as u8, 2);
assert_eq!(ExitCode::Timeout as u8, 3);
assert_eq!(ExitCode::MemoryExhausted as u8, 4);
assert_eq!(ExitCode::WorkerCrashed as u8, 5);
assert_eq!(ExitCode::SnapshotDiffTooLarge as u8, 6);
assert_eq!(ExitCode::MalformedDiagnostic as u8, 7);
assert_eq!(ExitCode::CleanupResidue as u8, 8);
assert_eq!(ExitCode::ConfigInvalid as u8, 64);
assert_eq!(ExitCode::DylibBuildFailed as u8, 65);
assert_eq!(ExitCode::DylibNotFound as u8, 66);
assert_eq!(ExitCode::ToolchainDrift as u8, 67);
}
#[test]
fn merge_takes_maximum() {
assert_eq!(
ExitCode::Timeout.merge(ExitCode::SnapshotDiffOrUnexpected),
ExitCode::Timeout
);
assert_eq!(
ExitCode::CleanupResidue.merge(ExitCode::WorkerCrashed),
ExitCode::CleanupResidue
);
assert_eq!(
ExitCode::ConfigInvalid.merge(ExitCode::CleanupResidue),
ExitCode::ConfigInvalid
);
assert_eq!(ExitCode::Ok.merge(ExitCode::Ok), ExitCode::Ok);
}
}