use crate::parse_file_paths;
use leo_errors::{PackageError, Result};
use std::{
borrow::Cow,
fs,
path::{Path, PathBuf},
};
pub static IMPORTS_DIRECTORY_NAME: &str = "imports/";
pub struct ImportsDirectory;
impl ImportsDirectory {
pub fn create(path: &Path) -> Result<PathBuf> {
let mut path = Cow::from(path);
if path.is_dir() && !path.ends_with(IMPORTS_DIRECTORY_NAME) {
path.to_mut().push(IMPORTS_DIRECTORY_NAME);
}
if !path.exists() {
fs::create_dir_all(&path)
.map_err(|err| PackageError::failed_to_create_directory(IMPORTS_DIRECTORY_NAME, err))?;
}
Ok(path.to_path_buf())
}
pub fn remove(path: &Path) -> Result<String> {
let mut path = Cow::from(path);
if path.is_dir() && !path.ends_with(IMPORTS_DIRECTORY_NAME) {
path.to_mut().push(IMPORTS_DIRECTORY_NAME);
}
if path.exists() {
fs::remove_dir_all(&path).map_err(|e| PackageError::failed_to_remove_directory(path.display(), e))?;
}
Ok(format!("(in \"{}\")", path.display()))
}
pub fn is_empty(path: &Path) -> Result<bool> {
let imports_path = path.join(Path::new(IMPORTS_DIRECTORY_NAME));
if !imports_path.exists() {
return Ok(true);
}
Ok(imports_path
.read_dir()
.map_err(|err| PackageError::failed_to_read_file(IMPORTS_DIRECTORY_NAME, err))?
.next()
.is_none())
}
pub fn files(path: &Path) -> Result<Vec<PathBuf>> {
let mut path = Cow::from(path);
if path.is_dir() && !path.ends_with(IMPORTS_DIRECTORY_NAME) {
path.to_mut().push(IMPORTS_DIRECTORY_NAME);
}
let directory = fs::read_dir(&path).map_err(|err| PackageError::failed_to_read_file(path.display(), err))?;
let mut file_paths = Vec::new();
parse_file_paths(directory, &mut file_paths)?;
Ok(file_paths)
}
}