use std::str::FromStr;
use mago_php_version::PHPVersion;
pub fn extract_minimum_php_version(version_constraint: &str) -> Option<String> {
let trimmed_constraint = version_constraint.replace(" ", "");
let constraints = trimmed_constraint.split("||").collect::<Vec<_>>();
let mut min_versions = Vec::new();
for constraint in constraints {
if let Some(version) = extract_version_from_constraint(constraint) {
min_versions.push(version);
}
}
if !min_versions.is_empty() {
min_versions.sort();
return Some(min_versions[0].to_string());
}
None
}
fn extract_version_from_constraint(constraint: &str) -> Option<PHPVersion> {
if constraint.starts_with(">=") {
let version_str = constraint.trim_start_matches(">=");
return PHPVersion::from_str(version_str).ok();
}
if constraint.starts_with(">") {
let version_str = constraint.trim_start_matches(">");
if let Ok(version) = PHPVersion::from_str(version_str) {
return Some(PHPVersion::new(
version.major(),
version.minor(),
version.patch().checked_add(1).unwrap_or(0),
));
}
}
if constraint.starts_with("~") {
let version_str = constraint.trim_start_matches("~");
return PHPVersion::from_str(version_str).ok();
}
if constraint.starts_with("^") {
let version_str = constraint.trim_start_matches("^");
return PHPVersion::from_str(version_str).ok();
}
if !constraint.starts_with("<") && !constraint.contains(">") {
let version_str = constraint.replace(".*", "").replace("*", "");
return PHPVersion::from_str(&version_str).ok();
}
None
}