#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum LicenseType {
DevelopmentSystem,
DebugDeploymentEnv,
BaseDeploymentEngine,
Oem,
Evaluation,
NoLicense,
Temporary,
Other,
CustomEditorDeployment,
}
impl LicenseType {
pub const fn from_bits(bits: i32) -> Result<Self, i32> {
match bits {
1 => Ok(Self::DevelopmentSystem),
2 => Ok(Self::DebugDeploymentEnv),
3 => Ok(Self::BaseDeploymentEngine),
4 => Ok(Self::Oem),
5 => Ok(Self::Evaluation),
6 => Ok(Self::NoLicense),
7 => Ok(Self::Temporary),
8 => Ok(Self::Other),
9 => Ok(Self::CustomEditorDeployment),
unknown => Err(unknown),
}
}
#[must_use]
pub const fn bits(self) -> i32 {
match self {
Self::DevelopmentSystem => 1,
Self::DebugDeploymentEnv => 2,
Self::BaseDeploymentEngine => 3,
Self::Oem => 4,
Self::Evaluation => 5,
Self::NoLicense => 6,
Self::Temporary => 7,
Self::Other => 8,
Self::CustomEditorDeployment => 9,
}
}
#[must_use]
pub const fn is_usable(self) -> bool {
!matches!(self, Self::NoLicense)
}
}
#[cfg(test)]
mod tests {
use super::LicenseType;
#[test]
fn every_documented_value_round_trips() {
for raw in 1..=9 {
let parsed = LicenseType::from_bits(raw);
assert_eq!(
parsed.map(LicenseType::bits),
Ok(raw),
"{raw} is documented but did not round-trip"
);
}
}
#[test]
fn an_unknown_value_is_returned_rather_than_guessed() {
assert_eq!(LicenseType::from_bits(99), Err(99));
assert_eq!(LicenseType::from_bits(0), Err(0));
}
#[test]
fn only_no_license_is_unusable() {
assert!(!LicenseType::NoLicense.is_usable());
for usable in [
LicenseType::DevelopmentSystem,
LicenseType::DebugDeploymentEnv,
LicenseType::BaseDeploymentEngine,
LicenseType::Oem,
LicenseType::Evaluation,
LicenseType::Temporary,
LicenseType::Other,
LicenseType::CustomEditorDeployment,
] {
assert!(usable.is_usable(), "{usable:?} should count as usable");
}
}
}