use std::path::{Component, Path, PathBuf};
use crate::error::DocError;
pub(crate) fn guard_output_path(output_dir: &Path, relative: &Path) -> Result<PathBuf, DocError> {
for component in relative.components() {
match component {
Component::ParentDir | Component::RootDir | Component::Prefix(_) => {
return Err(DocError::Escape(relative.display().to_string()));
}
Component::CurDir | Component::Normal(_) => {}
}
}
let joined = output_dir.join(relative);
if !joined.starts_with(output_dir) {
return Err(DocError::Escape(relative.display().to_string()));
}
Ok(joined)
}
#[cfg(test)]
#[path = "../tests/unit/escape.rs"]
mod tests;