use crate::backend::file_io::FileIO;
use crate::misc::{format_path, AccountError};
use std::path::PathBuf;
pub const BASE_NAME: &str = ".citadel";
pub const HYXE_FILE_OBFUSCATED_LEN: usize = 50;
#[allow(missing_docs)]
pub enum BasePath {
Home,
NacDirBase,
NacDirImpersonal,
NacDirPersonal,
ServerDir,
ConfigDir,
VirtualDir,
FileTransferDir,
}
#[derive(Clone)]
pub struct DirectoryStore {
pub home: String,
pub nac_dir_base: String,
pub nac_dir_impersonal: String,
pub nac_dir_personal: String,
pub server_dir: String,
pub config_dir: String,
pub virtual_dir: String,
pub file_transfer_dir: String,
}
impl DirectoryStore {
pub fn make_path<T: AsRef<str>>(&self, base: BasePath, file: T) -> PathBuf {
let base = match base {
BasePath::Home => &self.home,
BasePath::NacDirBase => &self.nac_dir_base,
BasePath::NacDirImpersonal => &self.nac_dir_impersonal,
BasePath::NacDirPersonal => &self.nac_dir_personal,
BasePath::ServerDir => &self.server_dir,
BasePath::ConfigDir => &self.config_dir,
BasePath::VirtualDir => &self.virtual_dir,
BasePath::FileTransferDir => &self.file_transfer_dir,
};
PathBuf::from(append_to_path(base.clone(), file.as_ref()))
}
}
#[allow(unused_results)]
fn setup_directory(mut home_dir: String) -> Result<DirectoryStore, AccountError> {
let home = {
{
if !home_dir.ends_with('/') {
home_dir.push('/');
}
}
#[cfg(target_os = "windows")]
{
if !home_dir.ends_with("\\") {
home_dir.push('\\');
}
}
home_dir
};
let hyxe_server_dir = append_to_path(home.clone(), "server/");
let dirs = DirectoryStore {
home: home.clone(),
nac_dir_base: append_to_path(home.clone(), "accounts/"),
nac_dir_impersonal: append_to_path(home.clone(), "accounts/impersonal/"),
nac_dir_personal: append_to_path(home.clone(), "accounts/personal/"),
server_dir: hyxe_server_dir,
config_dir: append_to_path(home.clone(), "config/"),
virtual_dir: append_to_path(home.clone(), "virtual/"),
file_transfer_dir: append_to_path(home, "transfers/"),
};
Ok(dirs)
}
fn append_to_path(base: String, addition: &str) -> String {
format_path(base + addition)
}
pub async fn setup_directories(
home_dir: String,
file_io: &dyn FileIO,
) -> Result<DirectoryStore, AccountError> {
let store = setup_directory(home_dir)?;
let dirs = [
store.home.as_str(),
store.nac_dir_base.as_str(),
store.nac_dir_impersonal.as_str(),
store.nac_dir_personal.as_str(),
store.server_dir.as_str(),
store.config_dir.as_str(),
store.virtual_dir.as_str(),
store.file_transfer_dir.as_str(),
];
for dir in dirs {
file_io.create_dir_all(dir).await?;
}
Ok(store)
}