use crate::migrate::migrate;
use anyhow::{Context, Result};
use std::path::{Path, PathBuf};
#[derive(Debug, Clone)]
pub struct Config {
pub data_dir: PathBuf,
pub installations_dir: PathBuf,
pub cache_dir: PathBuf,
pub git_cache_dir: PathBuf,
pub active_symlink: PathBuf,
pub bin_dir: PathBuf,
pub data_dir_format_version_file: PathBuf,
pub os: String,
pub arch: String,
}
impl Default for Config {
fn default() -> Self {
Self::new_for_path(&Self::default_data_dir())
}
}
impl Config {
pub fn new_for_path(data_dir: &Path) -> Self {
Self {
data_dir: data_dir.to_path_buf(),
installations_dir: data_dir.join("installations"),
cache_dir: data_dir.join("cache"),
git_cache_dir: data_dir.join("cache/git_cache"),
active_symlink: data_dir.join("current"),
bin_dir: data_dir.join("bin"),
data_dir_format_version_file: data_dir.join("gdenv_version.txt"),
os: std::env::consts::OS.to_string(),
arch: std::env::consts::ARCH.to_string(),
}
}
pub fn setup(data_dir: Option<&Path>) -> Result<Self> {
let data_dir = data_dir
.map(|d| d.to_path_buf())
.unwrap_or_else(Self::default_data_dir);
let config = Self::new_for_path(&data_dir);
migrate().context("Failed to migrate data directory")?;
std::fs::create_dir_all(&config.installations_dir)?;
std::fs::create_dir_all(&config.cache_dir)?;
std::fs::create_dir_all(&config.git_cache_dir)?;
std::fs::create_dir_all(&config.bin_dir)?;
Ok(config)
}
pub fn default_data_dir() -> PathBuf {
dirs::data_dir()
.unwrap_or_else(|| dirs::home_dir().unwrap_or_default().join(".local/share"))
.join("gdenv")
}
}