#[cfg(test)]
#[path = "./directory_test.rs"]
mod directory_test;
use crate::error::FsIOError;
use crate::path::as_path::AsPath;
use crate::path::get_parent_directory;
use crate::types::FsIOResult;
use std::fs::{create_dir_all, remove_dir_all};
pub fn create<T: AsPath + ?Sized>(path: &T) -> FsIOResult<()> {
let directory_path = path.as_path();
if directory_path.is_dir() && directory_path.exists() {
return Ok(());
}
match create_dir_all(&directory_path) {
Ok(_) => Ok(()),
Err(error) => Err(FsIOError::IOError(
format!("Unable to create directory: {:?}.", &directory_path).to_string(),
Some(error),
)),
}
}
pub fn create_parent<T: AsPath + ?Sized>(path: &T) -> FsIOResult<()> {
match get_parent_directory(path) {
Some(directory) => create(&directory),
None => Ok(()),
}
}
pub fn delete<T: AsPath + ?Sized>(path: &T) -> FsIOResult<()> {
let directory_path = path.as_path();
if directory_path.exists() {
if directory_path.is_dir() {
match remove_dir_all(directory_path) {
Ok(_) => Ok(()),
Err(error) => Err(FsIOError::IOError(
format!("Unable to delete directory: {:?}", &directory_path).to_string(),
Some(error),
)),
}
} else {
Err(FsIOError::NotFile(
format!("Path: {:?} is not a directory.", &directory_path).to_string(),
))
}
} else {
Ok(())
}
}