use crate::error::{Error, Result};
use std::path::PathBuf;
pub fn base_dir() -> Result<PathBuf> {
let home = dirs::home_dir().ok_or_else(|| {
Error::Io(std::io::Error::new(
std::io::ErrorKind::NotFound,
"Could not determine home directory",
))
})?;
Ok(home.join(".clickhouse"))
}
pub fn versions_dir() -> Result<PathBuf> {
Ok(base_dir()?.join("versions"))
}
pub fn version_dir(version: &str) -> Result<PathBuf> {
Ok(versions_dir()?.join(version))
}
pub fn binary_path(version: &str) -> Result<PathBuf> {
Ok(version_dir(version)?.join("clickhouse"))
}
pub fn default_file() -> Result<PathBuf> {
Ok(base_dir()?.join("default"))
}
pub fn ensure_dirs() -> Result<()> {
let versions = versions_dir()?;
std::fs::create_dir_all(&versions).map_err(|_| Error::CreateDir(versions))?;
Ok(())
}
pub fn global_bin_dir() -> Result<PathBuf> {
let home = dirs::home_dir().ok_or_else(|| {
Error::Io(std::io::Error::new(
std::io::ErrorKind::NotFound,
"Could not determine home directory",
))
})?;
Ok(home.join(".local").join("bin"))
}
pub fn global_clickhouse_symlink() -> Result<PathBuf> {
Ok(global_bin_dir()?.join("clickhouse"))
}