use std::path::Path;
const MODULE_FILE_STEM: &str = "mod";
pub struct ModulePath;
impl ModulePath {
pub fn of(root: &Path, path: &Path) -> String {
let relative = Self::relative(root, path);
let mut segments = Self::directories(relative);
let stem = relative
.file_stem()
.map(|stem| stem.to_string_lossy().into_owned())
.unwrap_or_default();
if stem != MODULE_FILE_STEM {
segments.push(stem);
}
segments.join("::")
}
fn relative<'a>(root: &Path, path: &'a Path) -> &'a Path {
if root == path {
Path::new(path.file_name().unwrap_or_default())
} else {
path.strip_prefix(root).unwrap_or(path)
}
}
fn directories(relative: &Path) -> Vec<String> {
relative
.parent()
.map(|parent| {
parent
.components()
.map(|component| component.as_os_str().to_string_lossy().into_owned())
.collect()
})
.unwrap_or_default()
}
}