use std::path::PathBuf;
use path_clean::PathClean;
pub fn create_data_directory(base_dir: Option<&PathBuf>) -> Result<(), std::io::Error> {
let home = default_path("", base_dir);
if home.exists() {
Ok(())
} else {
println!("Creating {home:?}");
std::fs::create_dir_all(home)
}
}
pub fn default_subdir(path: &str, base_dir: Option<&PathBuf>) -> String {
let home = default_path(path, base_dir);
String::from(home.to_str().expect("Invalid path value"))
}
pub fn default_path(filename: &str, base_path: Option<&PathBuf>) -> PathBuf {
let mut home = base_path.cloned().unwrap_or_else(|| {
[
dirs_next::home_dir().unwrap_or_else(|| PathBuf::from(".")),
PathBuf::from(".tari"),
]
.iter()
.collect()
});
for component in PathBuf::from(filename).components() {
home.push(component);
}
home
}
pub fn absolute_path<P>(path: P) -> PathBuf
where P: AsRef<std::path::Path> {
let path = path.as_ref();
if path.is_absolute() {
path.to_path_buf()
} else {
std::env::current_dir().unwrap_or_default().join(path)
}
.clean()
}
#[cfg(test)]
mod test {
use std::path::PathBuf;
use tari_test_utils::random::string;
use tempfile::tempdir;
use crate::dir_utils;
#[test]
fn test_multiple_levels_create_data_directory() {
let temp_dir = tempdir().unwrap();
let dir = &PathBuf::from(
temp_dir.path().to_path_buf().display().to_string() +
"/" +
&(0..12)
.collect::<Vec<usize>>()
.iter()
.map(|_| string(2))
.collect::<Vec<std::string::String>>()
.join("/") +
"/",
);
assert!(!std::path::Path::new(&dir.display().to_string()).exists());
dir_utils::create_data_directory(Some(dir)).unwrap();
assert!(std::path::Path::new(&dir.display().to_string()).exists());
}
#[test]
fn test_absolute_path_from_relative_path() {
let current_path = std::env::current_dir().unwrap_or_default();
let relative_path = PathBuf::from("./01/02/");
let joined_path = current_path.join(&relative_path);
assert_eq!(dir_utils::absolute_path(&relative_path), joined_path);
}
}