use crate::error::HomeDirError;
use std::env;
use std::fs;
use std::path::PathBuf;
use std::{process, thread};
use directories_next::BaseDirs;
pub fn name() -> &'static str {
"deadman"
}
fn dir() -> Result<PathBuf, HomeDirError> {
let base_dir = if cfg!(test) {
let thread_id = format!("{:?}", thread::current().id());
let test_dir = env::temp_dir()
.join(format!("{}_test", name()))
.join(format!(
"{}-{}",
process::id(),
thread_id.replace([':', '(', ')'], "-")
));
fs::create_dir_all(&test_dir).expect("failed to create test directory");
test_dir
} else {
BaseDirs::new()
.ok_or(HomeDirError::HomeDirNotFound)?
.config_dir()
.to_path_buf()
};
let dir = base_dir.join(name());
fs::create_dir_all(&dir)?;
Ok(dir)
}
pub fn file_path(file_name: &str) -> Result<PathBuf, HomeDirError> {
Ok(dir()?.join(file_name))
}
#[cfg(test)]
mod test {
use super::*;
use std::path::Path;
fn cleanup_test_dir(dir: &Path) {
if let Some(parent) = dir.parent() {
let _ = fs::remove_dir_all(parent);
}
}
fn cleanup_test_dir_parent(dir: &Path) {
if let Some(parent) = dir.parent() {
cleanup_test_dir(parent)
}
}
#[test]
fn file_path_in_test_mode() {
let file_name = "test.txt";
let result = file_path(file_name);
assert!(result.is_ok());
let result = result.unwrap();
let expected = format!("{}_test", name());
assert!(result.to_string_lossy().contains(expected.as_str()));
let expected = Path::new(name()).join(file_name);
assert!(
result
.to_string_lossy()
.contains(expected.to_string_lossy().as_ref())
);
cleanup_test_dir_parent(&result);
}
}