use anyhow::{format_err, Context, Result};
use path_clean::PathClean;
use std::env;
use std::path::{Path, PathBuf};
pub fn to_relative_path_to_project_root(tested_path_os_str: &str) -> Result<String> {
let path = absolute_path(PathBuf::from(tested_path_os_str))?;
let root_path = env::current_dir()?;
let printable_path = path.to_str().unwrap_or("");
let stripped_path = path.strip_prefix(&root_path).with_context(|| {
format!(
"file path outside the project directory: {0}",
printable_path
)
})?;
let stripped_path_str = stripped_path
.to_str()
.ok_or(format_err!("invalid unicode characters in the file path"))?;
Ok(stripped_path_str.to_string())
}
pub fn absolute_path(path: impl AsRef<Path>) -> Result<PathBuf> {
let path = path.as_ref();
let absolute_path = if path.is_absolute() {
path.to_path_buf()
} else {
env::current_dir()?.join(path)
}
.clean();
Ok(absolute_path)
}