46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
pub fn normalize_version(version: &str) -> String {
|
|
version.trim().trim_start_matches('v').to_string()
|
|
}
|
|
|
|
pub fn parse_version(version: &str) -> Vec<u64> {
|
|
normalize_version(version).split(['.', '-', '+']).map(|part| part.parse::<u64>().unwrap_or(0)).collect()
|
|
}
|
|
|
|
pub fn is_newer_version(latest: &str, current: &str) -> bool {
|
|
let latest_parts = parse_version(latest);
|
|
let current_parts = parse_version(current);
|
|
let max_len = latest_parts.len().max(current_parts.len());
|
|
|
|
for i in 0..max_len {
|
|
let latest_part = *latest_parts.get(i).unwrap_or(&0);
|
|
let current_part = *current_parts.get(i).unwrap_or(&0);
|
|
if latest_part > current_part {
|
|
return true;
|
|
}
|
|
if latest_part < current_part {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
false
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn normalizes_tag_versions() {
|
|
assert_eq!(normalize_version("v1.2.3"), "1.2.3");
|
|
assert_eq!(normalize_version(" 0.2.0 "), "0.2.0");
|
|
}
|
|
|
|
#[test]
|
|
fn compares_semver_like_versions() {
|
|
assert!(is_newer_version("0.2.1", "0.2.0"));
|
|
assert!(is_newer_version("1.0.0", "0.9.9"));
|
|
assert!(!is_newer_version("0.2.0", "0.2.0"));
|
|
assert!(!is_newer_version("0.1.9", "0.2.0"));
|
|
}
|
|
}
|