mars_agents/resolve/
constraint.rs1use semver::{Version, VersionReq};
2
3use super::VersionConstraint;
4
5pub fn parse_version_constraint(version: Option<&str>) -> VersionConstraint {
14 let version = match version {
15 None => return VersionConstraint::Latest,
16 Some(v) => v.trim(),
17 };
18
19 if version.is_empty() || version.eq_ignore_ascii_case("latest") {
20 return VersionConstraint::Latest;
21 }
22
23 if let Some(stripped) = version.strip_prefix('v') {
25 if let Ok(ver) = Version::parse(stripped) {
27 let req = VersionReq::parse(&format!("={ver}")).expect("valid exact req");
28 return VersionConstraint::Semver(req);
29 }
30
31 if let Ok(major) = stripped.parse::<u64>() {
33 let req = VersionReq::parse(&format!(">={major}.0.0, <{}.0.0", major + 1))
34 .expect("valid major range req");
35 return VersionConstraint::Semver(req);
36 }
37
38 let parts: Vec<&str> = stripped.split('.').collect();
40 if parts.len() == 2
41 && let (Ok(major), Ok(minor)) = (parts[0].parse::<u64>(), parts[1].parse::<u64>())
42 {
43 let req = VersionReq::parse(&format!(">={major}.{minor}.0, <{major}.{}.0", minor + 1))
44 .expect("valid minor range req");
45 return VersionConstraint::Semver(req);
46 }
47 }
48
49 if let Ok(req) = VersionReq::parse(version) {
51 return VersionConstraint::Semver(req);
52 }
53
54 VersionConstraint::RefPin(version.to_string())
56}