use std::borrow::Cow;
pub(crate) fn join_version<'a>(parts: &[Option<&'a str>]) -> Option<Cow<'a, str>> {
let end = parts.iter().position(Option::is_none).unwrap_or(parts.len());
let parts = &parts[..end];
match parts {
[] => None,
[Some(major)] => Some(Cow::from(*major)),
_ => {
let capacity = parts.iter().flatten().map(|part| part.len() + 1).sum::<usize>() - 1;
let mut version = String::with_capacity(capacity);
for (index, part) in parts.iter().flatten().enumerate() {
if index > 0 {
version.push('.');
}
version.push_str(part);
}
Some(Cow::from(version))
},
}
}