use std::path::{Component, Path, PathBuf};
pub fn common_base_directory(paths: &[impl AsRef<Path>]) -> Option<PathBuf> {
let first_path = paths.first().map(AsRef::as_ref)?;
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.get(i) == comps.get(i) {
i += 1;
}
common.truncate(i);
if common.is_empty() {
return None;
}
}
Some(PathBuf::from_iter(common))
}