use version::Version;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum OsRelease {
Windows7,
Windows8,
Windows8_1,
Windows10,
#[doc(hidden)]
_NonExhaustive,
}
impl<'a> From<OsRelease> for &'a str {
fn from(release: OsRelease) -> Self {
match release {
OsRelease::Windows7 => "7",
OsRelease::Windows8 => "8",
OsRelease::Windows8_1 => "8.1",
OsRelease::Windows10 => "10",
OsRelease::_NonExhaustive => unsafe {
std::hint::unreachable_unchecked()
},
}
}
}
impl OsRelease {
pub const MIN: OsRelease = OsRelease::Windows7;
pub const LATEST: OsRelease = OsRelease::Windows10;
pub fn new<V: Into<Version>>(version: V) -> Option<Self> {
let Version { major, minor, .. } = version.into();
match (major, minor) {
(06, 1) => Some(OsRelease::Windows7),
(06, 2) => Some(OsRelease::Windows8),
(06, 3) => Some(OsRelease::Windows8_1),
(10, 0) => Some(OsRelease::Windows10),
_ => None
}
}
}
impl From<OsRelease> for Version {
fn from(release: OsRelease) -> Version {
let pair = match release {
OsRelease::Windows7 => (06, 1),
OsRelease::Windows8 => (06, 2),
OsRelease::Windows8_1 => (06, 3),
OsRelease::Windows10 => (10, 0),
OsRelease::_NonExhaustive => unsafe {
std::hint::unreachable_unchecked()
},
};
pair.into()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cmp() {
assert!(OsRelease::LATEST > OsRelease::MIN);
}
}