use anyhow::{Context, Result};
use std::fs;
use std::path::PathBuf;
pub fn get_octomind_data_dir() -> Result<PathBuf> {
let data_dir = match dirs::home_dir() {
Some(home) => {
#[cfg(target_os = "windows")]
let path = {
match dirs::data_local_dir() {
Some(dir) => dir.join("octomind"),
None => home.join("AppData").join("Local").join("octomind"),
}
};
#[cfg(not(target_os = "windows"))]
let path = home.join(".local").join("share").join("octomind");
path
}
None => {
return Err(anyhow::anyhow!("Unable to determine home directory"));
}
};
if !data_dir.exists() {
fs::create_dir_all(&data_dir).context(format!(
"Failed to create octomind data directory: {}",
data_dir.display()
))?;
}
Ok(data_dir)
}
pub fn get_config_dir() -> Result<PathBuf> {
let data_dir = get_octomind_data_dir()?;
let config_dir = data_dir.join("config");
if !config_dir.exists() {
fs::create_dir_all(&config_dir)?;
}
Ok(config_dir)
}
pub fn get_sessions_dir() -> Result<PathBuf> {
let data_dir = get_octomind_data_dir()?;
let sessions_dir = data_dir.join("sessions");
if !sessions_dir.exists() {
fs::create_dir_all(&sessions_dir)?;
}
Ok(sessions_dir)
}
pub fn get_logs_dir() -> Result<PathBuf> {
let data_dir = get_octomind_data_dir()?;
let logs_dir = data_dir.join("logs");
if !logs_dir.exists() {
fs::create_dir_all(&logs_dir)?;
}
Ok(logs_dir)
}
pub fn get_cache_dir() -> Result<PathBuf> {
let data_dir = get_octomind_data_dir()?;
let cache_dir = data_dir.join("cache");
if !cache_dir.exists() {
fs::create_dir_all(&cache_dir)?;
}
Ok(cache_dir)
}
pub fn get_config_file_path() -> Result<PathBuf> {
let config_dir = get_config_dir()?;
Ok(config_dir.join("config.toml"))
}
pub fn print_directory_info() -> Result<()> {
println!("Octomind Data Directories:");
println!(" Data Dir: {}", get_octomind_data_dir()?.display());
println!(" Config Dir: {}", get_config_dir()?.display());
println!(" Sessions Dir: {}", get_sessions_dir()?.display());
println!(" Logs Dir: {}", get_logs_dir()?.display());
println!(" Cache Dir: {}", get_cache_dir()?.display());
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_octomind_data_dir() {
let result = get_octomind_data_dir();
assert!(result.is_ok());
let path = result.unwrap();
assert!(path.to_string_lossy().contains("octomind"));
assert!(path.exists());
}
#[test]
fn test_subdirectories() {
assert!(get_config_dir().is_ok());
assert!(get_sessions_dir().is_ok());
assert!(get_logs_dir().is_ok());
assert!(get_cache_dir().is_ok());
}
#[test]
fn test_config_file_path() {
let config_path = get_config_file_path().unwrap();
assert!(config_path.to_string_lossy().ends_with("config.toml"));
}
}