use std::path::PathBuf;
#[derive(Debug, Clone)]
pub struct AcpPaths {
base_dir: PathBuf,
}
impl AcpPaths {
pub fn new() -> Self {
let base_dir = dirs::data_local_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join("acp-agents");
Self { base_dir }
}
pub fn with_base_dir(base_dir: PathBuf) -> Self {
Self { base_dir }
}
pub fn base_dir(&self) -> &PathBuf {
&self.base_dir
}
pub fn agent_dir(&self, agent_id: &str) -> PathBuf {
self.base_dir.join(agent_id)
}
pub fn agent_version_dir(&self, agent_id: &str, version: &str) -> PathBuf {
self.agent_dir(agent_id).join(version)
}
pub fn downloads_dir(&self) -> PathBuf {
self.base_dir.join(".downloads")
}
pub fn agent_download_dir(&self, agent_id: &str, version: &str) -> PathBuf {
self.downloads_dir().join(agent_id).join(version)
}
pub fn runtimes_dir(&self) -> PathBuf {
self.base_dir.join(".runtimes")
}
pub fn runtime_dir(&self, runtime: &str, version: &str) -> PathBuf {
self.runtimes_dir().join(runtime).join(version)
}
pub fn icons_dir(&self) -> PathBuf {
self.base_dir.join(".icons")
}
pub fn registry_cache_path(&self) -> PathBuf {
self.base_dir.join("registry.json")
}
pub fn installed_state_path(&self) -> PathBuf {
self.base_dir.join("installed.json")
}
pub fn ensure_directories(&self) -> std::io::Result<()> {
std::fs::create_dir_all(&self.base_dir)?;
std::fs::create_dir_all(self.downloads_dir())?;
std::fs::create_dir_all(self.runtimes_dir())?;
std::fs::create_dir_all(self.icons_dir())?;
Ok(())
}
pub fn current_platform() -> String {
let os = std::env::consts::OS;
let arch = std::env::consts::ARCH;
let os_name = match os {
"macos" => "darwin",
"linux" => "linux",
"windows" => "windows",
other => other,
};
format!("{}-{}", os_name, arch)
}
}
impl Default for AcpPaths {
fn default() -> Self {
Self::new()
}
}