use semver::Version;
fn is_version_newer(current: &str, latest: &str) -> bool {
if current == "any" {
return true;
}
let current_clean = current
.trim_start_matches('^')
.trim_start_matches('~')
.trim_start_matches('>')
.trim_start_matches('=')
.trim_start_matches('<')
.trim();
let latest_clean = latest
.trim_start_matches('^')
.trim_start_matches('~')
.trim_start_matches('>')
.trim_start_matches('=')
.trim_start_matches('<')
.trim();
if let (Ok(current_ver), Ok(latest_ver)) =
(Version::parse(current_clean), Version::parse(latest_clean))
{
return latest_ver > current_ver;
}
let normalize_version = |v: &str| {
let parts: Vec<&str> = v.split('.').collect();
match parts.len() {
1 => format!("{}.0.0", parts[0]),
2 => format!("{}.{}.0", parts[0], parts[1]),
_ => v.to_string(),
}
};
let current_normalized = normalize_version(current_clean);
let latest_normalized = normalize_version(latest_clean);
if let (Ok(current_ver), Ok(latest_ver)) = (
Version::parse(¤t_normalized),
Version::parse(&latest_normalized),
) {
latest_ver > current_ver
} else {
latest_clean > current_clean
}
}
fn main() {
println!("Testing version comparison:");
println!("^1.0.0 vs 1.0.8: {}", is_version_newer("^1.0.0", "1.0.8"));
println!("1.0.0 vs 1.0.8: {}", is_version_newer("1.0.0", "1.0.8"));
println!("^1.0.2 vs 1.0.8: {}", is_version_newer("^1.0.2", "1.0.8"));
}