use ggen_utils::error::Result;
use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Debug, Clone)]
pub struct GgenEnvironment {
pub home_dir: PathBuf,
pub templates_dir: PathBuf,
pub cache_dir: PathBuf,
pub config_dir: PathBuf,
pub config: GgenConfig,
}
#[derive(Debug, Clone)]
pub struct GgenConfig {
pub editor: Option<String>,
pub default_template: Option<String>,
pub custom_vars: HashMap<String, String>,
}
pub trait EnvironmentManager {
fn get_environment(&self) -> Result<GgenEnvironment>;
fn set_var(&self, key: &str, value: &str) -> Result<()>;
fn get_var(&self, key: &str) -> Option<String>;
fn list_vars(&self) -> Vec<(String, String)>;
fn ensure_directories(&self) -> Result<()>;
fn clear_cache(&self) -> Result<usize>;
}
#[derive(Debug, Clone)]
pub struct DefaultEnvironmentManager;
impl EnvironmentManager for DefaultEnvironmentManager {
fn get_environment(&self) -> Result<GgenEnvironment> {
let home_dir = std::env::var("HOME")
.map(PathBuf::from)
.unwrap_or_else(|_| PathBuf::from("."));
Ok(GgenEnvironment {
home_dir: home_dir.clone(),
templates_dir: home_dir.join(".ggen/templates"),
cache_dir: home_dir.join(".ggen/cache"),
config_dir: home_dir.join(".ggen/config"),
config: GgenConfig {
editor: None,
default_template: None,
custom_vars: HashMap::new(),
},
})
}
fn set_var(&self, key: &str, value: &str) -> Result<()> {
std::env::set_var(key, value);
Ok(())
}
fn get_var(&self, key: &str) -> Option<String> {
std::env::var(key).ok()
}
fn list_vars(&self) -> Vec<(String, String)> {
std::env::vars()
.filter(|(k, _)| k.starts_with("GGEN_"))
.collect()
}
fn ensure_directories(&self) -> Result<()> {
let env = self.get_environment()?;
std::fs::create_dir_all(&env.templates_dir)?;
std::fs::create_dir_all(&env.cache_dir)?;
std::fs::create_dir_all(&env.config_dir)?;
Ok(())
}
fn clear_cache(&self) -> Result<usize> {
let env = self.get_environment()?;
let mut count = 0;
if env.cache_dir.exists() {
for entry in std::fs::read_dir(&env.cache_dir)? {
let entry = entry?;
std::fs::remove_file(entry.path())?;
count += 1;
}
}
Ok(count)
}
}
pub async fn execute_env_list() -> Result<HashMap<String, String>> {
let manager = DefaultEnvironmentManager;
Ok(manager.list_vars().into_iter().collect())
}
pub async fn execute_env_show_dirs() -> Result<GgenEnvironment> {
let manager = DefaultEnvironmentManager;
manager.get_environment()
}
pub async fn execute_env_ensure_dirs() -> Result<()> {
let manager = DefaultEnvironmentManager;
manager.ensure_directories()
}
pub async fn execute_env_clear_cache() -> Result<usize> {
let manager = DefaultEnvironmentManager;
manager.clear_cache()
}
pub async fn execute_env_get(key: String) -> Result<Option<String>> {
let manager = DefaultEnvironmentManager;
Ok(manager.get_var(&key))
}
pub async fn execute_env_set(key: String, value: String) -> Result<()> {
let manager = DefaultEnvironmentManager;
manager.set_var(&key, &value)
}