use std::path::Path;
pub fn create_folder<P: AsRef<Path>>(path: P) {
let path = path.as_ref();
if !path.exists() {
std::fs::create_dir_all(path)
.unwrap_or_else(|_| panic!("Failed to create folder at '{path:?}'."));
}
}
pub fn create_folder_for_file<P: AsRef<Path>>(path: P) {
let path = path.as_ref();
if let Some(parent) = path.parent() {
create_folder(parent);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::delete::delete_folder;
use crate::path::to_path_buf;
use crate::test_utils::{assert_folder_exists, get_temp_dir_path};
use tempfile::tempdir;
#[test]
fn test_create_delete_folder_basic() {
let temp_dir = tempdir().unwrap();
let new_folder_path = get_temp_dir_path(&temp_dir).join("new_folder");
let new_folder_paths: Vec<Box<dyn AsRef<Path>>> = vec![
Box::new(new_folder_path.to_str().unwrap()), Box::new(new_folder_path.to_str().unwrap().to_string()), Box::new(new_folder_path.as_path()), Box::new(new_folder_path.clone()), ];
for new_folder_path in new_folder_paths {
let new_folder_path: &dyn AsRef<Path> = new_folder_path.as_ref();
assert!(!to_path_buf(new_folder_path).exists());
create_folder(new_folder_path);
assert_folder_exists(new_folder_path);
create_folder(new_folder_path);
assert_folder_exists(new_folder_path);
delete_folder(new_folder_path);
}
}
#[test]
fn test_create_folder_nested() {
let temp_dir = tempdir().unwrap();
let nested = get_temp_dir_path(&temp_dir).join("a/b/c");
create_folder(&nested);
assert_folder_exists(nested);
}
#[test]
fn test_create_folder_for_file() {
let temp_dir = tempdir().unwrap();
let file_path = get_temp_dir_path(&temp_dir).join("a/b/c/file.txt");
let file_paths: Vec<Box<dyn AsRef<Path>>> = vec![
Box::new(file_path.to_str().unwrap()), Box::new(file_path.to_str().unwrap().to_string()), Box::new(file_path.as_path()), Box::new(file_path.clone()), ];
for file_path in file_paths {
let file_path = file_path.as_ref();
let file_path_buf = to_path_buf(file_path);
assert!(!file_path_buf.parent().unwrap().exists());
create_folder_for_file(file_path);
assert_folder_exists(file_path_buf.parent().unwrap());
assert!(!file_path_buf.exists());
create_folder_for_file(file_path);
assert_folder_exists(file_path_buf.parent().unwrap());
delete_folder(file_path_buf.parent().unwrap());
}
}
}