#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ThreadTerminationOption {
Normal,
Prompt,
Never,
}
impl ThreadTerminationOption {
pub const fn from_bits(bits: i32) -> Result<Self, i32> {
match bits {
0 => Ok(Self::Normal),
1 => Ok(Self::Prompt),
2 => Ok(Self::Never),
unknown => Err(unknown),
}
}
#[must_use]
pub const fn bits(self) -> i32 {
match self {
Self::Normal => 0,
Self::Prompt => 1,
Self::Never => 2,
}
}
#[must_use]
pub const fn stops_with_execution(self) -> bool {
matches!(self, Self::Normal)
}
}
#[cfg(test)]
mod tests {
use super::ThreadTerminationOption;
#[test]
fn every_documented_value_round_trips() {
for raw in 0..=2 {
assert_eq!(
ThreadTerminationOption::from_bits(raw).map(ThreadTerminationOption::bits),
Ok(raw),
"{raw} is documented but did not round-trip"
);
}
}
#[test]
fn an_unknown_value_is_returned_rather_than_guessed() {
assert_eq!(ThreadTerminationOption::from_bits(7), Err(7));
}
#[test]
fn only_normal_stops_with_its_execution() {
assert!(ThreadTerminationOption::Normal.stops_with_execution());
assert!(!ThreadTerminationOption::Prompt.stops_with_execution());
assert!(!ThreadTerminationOption::Never.stops_with_execution());
}
}