use semver::{Version, VersionReq};
use super::VersionConstraint;
pub fn parse_version_constraint(version: Option<&str>) -> VersionConstraint {
let version = match version {
None => return VersionConstraint::Latest,
Some(v) => v.trim(),
};
if version.is_empty() || version.eq_ignore_ascii_case("latest") {
return VersionConstraint::Latest;
}
if let Some(stripped) = version.strip_prefix('v') {
if let Ok(ver) = Version::parse(stripped) {
let req = VersionReq::parse(&format!("={ver}")).expect("valid exact req");
return VersionConstraint::Semver(req);
}
if let Ok(major) = stripped.parse::<u64>() {
let req = VersionReq::parse(&format!(">={major}.0.0, <{}.0.0", major + 1))
.expect("valid major range req");
return VersionConstraint::Semver(req);
}
let parts: Vec<&str> = stripped.split('.').collect();
if parts.len() == 2
&& let (Ok(major), Ok(minor)) = (parts[0].parse::<u64>(), parts[1].parse::<u64>())
{
let req = VersionReq::parse(&format!(">={major}.{minor}.0, <{major}.{}.0", minor + 1))
.expect("valid minor range req");
return VersionConstraint::Semver(req);
}
}
if let Ok(req) = VersionReq::parse(version) {
return VersionConstraint::Semver(req);
}
VersionConstraint::RefPin(version.to_string())
}