use std::cmp::Ordering;
pub(super) fn compare_versions(a: &str, b: &str) -> Ordering {
let a_parts: Vec<&str> = a.split(['.', '-']).collect();
let b_parts: Vec<&str> = b.split(['.', '-']).collect();
let len = a_parts.len().max(b_parts.len());
for idx in 0..len {
let a_seg = a_parts.get(idx).copied().unwrap_or("0");
let b_seg = b_parts.get(idx).copied().unwrap_or("0");
match (a_seg.parse::<i64>(), b_seg.parse::<i64>()) {
(Ok(a_num), Ok(b_num)) => match a_num.cmp(&b_num) {
Ordering::Equal => {}
ord => return ord,
},
_ => match a_seg.cmp(b_seg) {
Ordering::Equal => {}
ord => return ord,
},
}
}
Ordering::Equal
}
pub(super) fn is_major_version_bump(old: &str, new: &str) -> bool {
match (extract_major_component(old), extract_major_component(new)) {
(Some(old_major), Some(new_major)) => new_major > old_major,
_ => false,
}
}
fn extract_major_component(version: &str) -> Option<u64> {
let token = version.split(['.', '-']).next()?;
token.parse::<u64>().ok()
}