use std::path::{Component, Path, PathBuf};
pub fn common_base_directory(paths: &[impl AsRef<Path>]) -> Option<PathBuf> {
let Some(first_path) = paths.first().map(AsRef::as_ref) else {
return None;
};
let mut common: Vec<Component> = match first_path.parent() {
Some(parent) => parent.components().collect(),
None => first_path.components().collect(),
};
for path in paths.iter().skip(1) {
let p = path.as_ref();
let dir = p.parent().unwrap_or(p);
let comps: Vec<Component> = dir.components().collect();
let mut i = 0;
while i < common.len() && i < comps.len() && common[i] == comps[i] {
i += 1;
}
common.truncate(i);
if common.is_empty() {
return None;
}
}
Some(PathBuf::from_iter(common))
}