use crate::{constants, errors};
pub(crate) fn current_dir() -> std::path::PathBuf {
std::env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from(constants::DOT))
}
pub(crate) fn current_dir_string() -> String {
current_dir().to_string_lossy().to_string()
}
pub(crate) fn home_dir() -> std::path::PathBuf {
dirs::home_dir().unwrap_or_else(|| std::path::PathBuf::from("/tmp"))
}
pub fn abspath(path: &std::path::Path) -> std::path::PathBuf {
path.to_path_buf()
.canonicalize()
.unwrap_or_else(|_| path.to_path_buf())
}
pub(crate) fn strip_prefix(
root: &std::path::Path,
path: &std::path::Path,
) -> Result<std::path::PathBuf, errors::GardenError> {
let stripped_path = if path.starts_with(root) {
path.strip_prefix(root)
.map_err(|err| {
errors::GardenError::ConfigurationError(format!(
"{path:?} is not a child of {root:?}: {err:?}"
))
})?
.to_path_buf()
} else {
path.to_path_buf()
};
Ok(stripped_path)
}
pub(crate) fn strip_prefix_into_string(
root: &std::path::Path,
path: &std::path::Path,
) -> Result<String, errors::GardenError> {
let path_str = strip_prefix(root, path)?.to_string_lossy().to_string();
Ok(path_str)
}