use std::path::{Path, PathBuf};
pub fn create_output_file_name(
base_dir: &PathBuf,
input_file: &PathBuf,
) -> Result<PathBuf, String> {
let output_base_dir = get_output_working_dir(&base_dir)?;
let relative_file_name = remove_base_dir(&base_dir, &input_file)?;
Ok(output_base_dir.join(relative_file_name))
}
pub fn create_output_file_name_with_output_dir(
output_dir: &PathBuf,
base_dir: &PathBuf,
input_file: &PathBuf,
) -> Result<PathBuf, String> {
let relative_file_name = remove_base_dir(&base_dir, &input_file)?;
Ok(output_dir.join(relative_file_name))
}
pub fn get_output_working_dir(input_dir: &PathBuf) -> Result<PathBuf, String> {
if let None = &input_dir.file_name() {
return Err(String::from(
"The last segment of the input path is not valid!",
));
};
let input_dir_name = input_dir.file_name().unwrap();
let parent = match input_dir.parent() {
Some(p) => p,
None => Path::new(""),
};
Ok(parent
.join(format!("{}-html5picture", input_dir_name.to_str().unwrap())))
}
pub fn remove_base_dir(
base_dir: &PathBuf,
input_file: &PathBuf,
) -> Result<PathBuf, String> {
match pathdiff::diff_paths(input_file, base_dir) {
Some(p) => Ok(p),
None => match input_file.to_str() {
Some(v) => {
Err(String::from(format!("Could not remove base dir of {}", v)))
}
None => Err(String::from("Could not remove base dir!")),
},
}
}