use crate::error::ApiError;
use std::path::{Path, PathBuf};
pub fn data_home() -> Option<PathBuf> {
if let Ok(xdg_data_home) = std::env::var("XDG_DATA_HOME") {
return Some(PathBuf::from(xdg_data_home));
}
std::env::var("HOME")
.ok()
.map(|home| PathBuf::from(home).join(".local").join("share"))
}
pub fn workspace_data_dir(workspace_root: &Path) -> Result<PathBuf, ApiError> {
let data_home = data_home().ok_or_else(|| {
ApiError::ConfigError(
"Could not determine XDG data home directory (HOME not set)".to_string(),
)
})?;
let canonical = workspace_root.canonicalize().map_err(|e| {
ApiError::ConfigError(format!("Failed to canonicalize workspace path: {}", e))
})?;
let mut data_dir = data_home.join("meld");
for component in canonical.components() {
match component {
std::path::Component::RootDir => {}
std::path::Component::Prefix(_) => {}
std::path::Component::CurDir => {}
std::path::Component::ParentDir => {}
std::path::Component::Normal(name) => {
data_dir = data_dir.join(name);
}
}
}
Ok(data_dir)
}
pub fn config_home() -> Result<PathBuf, ApiError> {
if let Ok(xdg_config_home) = std::env::var("XDG_CONFIG_HOME") {
return Ok(PathBuf::from(xdg_config_home));
}
let home = std::env::var("HOME").map_err(|_| {
ApiError::ConfigError(
"Could not determine XDG config home directory (HOME not set)".to_string(),
)
})?;
Ok(PathBuf::from(home).join(".config"))
}
pub fn agents_dir() -> Result<PathBuf, ApiError> {
let config_home = config_home()?;
let agents_dir = config_home.join("meld").join("agents");
if !agents_dir.exists() {
std::fs::create_dir_all(&agents_dir).map_err(|e| {
ApiError::ConfigError(format!(
"Failed to create agents directory {}: {}",
agents_dir.display(),
e
))
})?;
}
Ok(agents_dir)
}
pub fn providers_dir() -> Result<PathBuf, ApiError> {
let config_home = config_home()?;
let providers_dir = config_home.join("meld").join("providers");
if !providers_dir.exists() {
std::fs::create_dir_all(&providers_dir).map_err(|e| {
ApiError::ConfigError(format!(
"Failed to create providers directory {}: {}",
providers_dir.display(),
e
))
})?;
}
Ok(providers_dir)
}
pub fn prompts_dir() -> Result<PathBuf, ApiError> {
let config_home = config_home()?;
let prompts_dir = config_home.join("meld").join("prompts");
if !prompts_dir.exists() {
std::fs::create_dir_all(&prompts_dir).map_err(|e| {
ApiError::ConfigError(format!(
"Failed to create prompts directory {}: {}",
prompts_dir.display(),
e
))
})?;
}
Ok(prompts_dir)
}