image_optimizer/updater/
version_comparator.rs1use anyhow::Result;
2
3pub fn compare_versions(current: &str, latest: &str) -> Result<bool> {
41 let current_clean = current.trim_start_matches('v');
42 let latest_clean = latest.trim_start_matches('v');
43
44 let parse_version = |v: &str| -> Result<Vec<u32>> {
45 v.split('.')
46 .map(|part| {
47 part.parse::<u32>()
48 .map_err(|e| anyhow::anyhow!("Invalid version format: {}", e))
49 })
50 .collect()
51 };
52
53 let current_parts = parse_version(current_clean)?;
54 let latest_parts = parse_version(latest_clean)?;
55
56 for (curr, latest) in current_parts.iter().zip(latest_parts.iter()) {
58 if latest > curr {
59 return Ok(true); } else if curr > latest {
61 return Ok(false); }
63 }
64
65 Ok(latest_parts.len() > current_parts.len())
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72
73 #[test]
74 fn test_version_comparison() {
75 assert!(compare_versions("1.0.0", "1.0.1").unwrap());
76 assert!(compare_versions("1.0.0", "1.1.0").unwrap());
77 assert!(compare_versions("1.0.0", "2.0.0").unwrap());
78 assert!(!compare_versions("1.0.1", "1.0.0").unwrap());
79 assert!(!compare_versions("1.1.0", "1.0.0").unwrap());
80 assert!(!compare_versions("2.0.0", "1.0.0").unwrap());
81 assert!(!compare_versions("1.0.0", "1.0.0").unwrap());
82 }
83
84 #[test]
85 fn test_version_with_v_prefix() {
86 assert!(compare_versions("v1.0.0", "v1.0.1").unwrap());
87 assert!(compare_versions("1.0.0", "v1.0.1").unwrap());
88 assert!(compare_versions("v1.0.0", "1.0.1").unwrap());
89 }
90
91 #[test]
92 fn test_different_version_lengths() {
93 assert!(compare_versions("1.0", "1.0.1").unwrap());
94 assert!(!compare_versions("1.0.1", "1.0").unwrap());
95 assert!(!compare_versions("1.0", "1.0").unwrap());
96 }
97
98 #[test]
99 fn test_invalid_version_format() {
100 assert!(compare_versions("invalid", "1.0.0").is_err());
101 assert!(compare_versions("1.0.0", "invalid").is_err());
102 assert!(compare_versions("1.x.0", "1.0.0").is_err());
103 }
104
105 #[test]
106 fn test_real_world_versions() {
107 assert!(compare_versions("1.2.1", "1.2.2").unwrap());
108 assert!(compare_versions("0.9.0", "1.0.0").unwrap());
109 assert!(!compare_versions("2.0.0", "1.9.9").unwrap());
110 }
111}