diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-04-11 13:56:08 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-04-30 16:22:52 +0200 |
| commit | 8287a14f70dafbc1b59a752e006bf6b9d2242523 (patch) | |
| tree | 944ba7ab84279fba4ed32cba1949910263af60c7 | |
| parent | 876f9cb5d5abf3e4d56cce5aee3597fdb5ad14e3 (diff) | |
| download | mullvadvpn-8287a14f70dafbc1b59a752e006bf6b9d2242523.tar.xz mullvadvpn-8287a14f70dafbc1b59a752e006bf6b9d2242523.zip | |
Implement PartialOrd for MacosVersion
| -rw-r--r-- | talpid-platform-metadata/src/macos.rs | 93 |
1 files changed, 83 insertions, 10 deletions
diff --git a/talpid-platform-metadata/src/macos.rs b/talpid-platform-metadata/src/macos.rs index 707130721b..7949f34539 100644 --- a/talpid-platform-metadata/src/macos.rs +++ b/talpid-platform-metadata/src/macos.rs @@ -1,7 +1,9 @@ mod command; use command::command_stdout_lossy; -use std::io; +use std::cmp::Ordering; +use std::fmt::Formatter; +use std::{fmt, io}; pub fn version() -> String { let version = MacosVersion::new() @@ -21,12 +23,35 @@ pub fn extra_metadata() -> impl Iterator<Item = (String, String)> { std::iter::empty() } -#[derive(Debug, PartialEq)] +#[derive(Debug, Clone)] pub struct MacosVersion { raw_version: String, major: u32, minor: u32, - patch: u32, + patch: Option<u32>, +} + +impl PartialEq for MacosVersion { + fn eq(&self, other: &Self) -> bool { + self.major_version() == other.major_version() + && self.minor_version() == other.minor_version() + && self.patch_version() == other.patch_version() + } +} + +impl PartialOrd for MacosVersion { + fn partial_cmp(&self, other: &Self) -> Option<Ordering> { + let major = self.major_version().partial_cmp(&other.major_version())?; + let minor = self.minor_version().partial_cmp(&other.minor_version())?; + let patch = self.patch_version().partial_cmp(&other.patch_version())?; + Some(major.then(minor).then(patch)) + } +} + +impl fmt::Display for MacosVersion { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.write_str(&self.version()) + } } impl MacosVersion { @@ -34,7 +59,7 @@ impl MacosVersion { Self::from_raw_version(&run_sw_vers()?) } - fn from_raw_version(version_string: &str) -> Result<MacosVersion, io::Error> { + pub fn from_raw_version(version_string: &str) -> Result<MacosVersion, io::Error> { let (major, minor, patch) = parse_version_output(version_string).ok_or(io::Error::new( io::ErrorKind::InvalidInput, "Failed to parse raw version string", @@ -66,7 +91,7 @@ impl MacosVersion { } pub fn patch_version(&self) -> u32 { - self.patch + self.patch.unwrap_or(0) } } @@ -75,14 +100,11 @@ fn run_sw_vers() -> io::Result<String> { command_stdout_lossy("sw_vers", &["-productVersion"]) } -fn parse_version_output(output: &str) -> Option<(u32, u32, u32)> { +fn parse_version_output(output: &str) -> Option<(u32, u32, Option<u32>)> { let mut parts = output.split('.'); let major = parts.next()?.parse().ok()?; let minor = parts.next()?.parse().ok()?; - let patch = parts - .next() - .and_then(|patch| patch.parse().ok()) - .unwrap_or(0); + let patch = parts.next().and_then(|patch| patch.parse().ok()); Some((major, minor, patch)) } @@ -95,3 +117,54 @@ fn test_version_parsing() { assert_eq!(version.minor_version(), 2); assert_eq!(version.patch_version(), 1); } + +#[test] +fn test_version_order() { + assert_eq!( + MacosVersion::from_raw_version("13.0").unwrap(), + MacosVersion::from_raw_version("13.0.0").unwrap() + ); + + assert!( + !(MacosVersion::from_raw_version("13.0").unwrap() + < MacosVersion::from_raw_version("13.0.0").unwrap()) + ); + assert!( + !(MacosVersion::from_raw_version("13.0").unwrap() + > MacosVersion::from_raw_version("13.0.0").unwrap()) + ); + + // test major version + assert!( + MacosVersion::from_raw_version("13.0").unwrap() + < MacosVersion::from_raw_version("14.2.1").unwrap() + ); + assert!( + MacosVersion::from_raw_version("13.0").unwrap() + > MacosVersion::from_raw_version("12.1").unwrap() + ); + + // test minor version + assert!( + MacosVersion::from_raw_version("14.3").unwrap() + > MacosVersion::from_raw_version("14.2").unwrap() + ); + assert!( + MacosVersion::from_raw_version("14.2").unwrap() + < MacosVersion::from_raw_version("14.3").unwrap() + ); + + // test patch version + assert!( + MacosVersion::from_raw_version("14.2.1").unwrap() + > MacosVersion::from_raw_version("14.2").unwrap() + ); + assert!( + MacosVersion::from_raw_version("14.2.2").unwrap() + > MacosVersion::from_raw_version("14.2.1").unwrap() + ); + assert!( + MacosVersion::from_raw_version("14.2.2").unwrap() + < MacosVersion::from_raw_version("14.2.3").unwrap() + ); +} |
