use std::io; use std::env; use std::path::Path; use std::collections::HashMap; use super::*; pub fn get_install_env(repo: &String, pkgname: &String, pkg_md_path: &Path, stage: &str) -> HashMap { let mut full_env = HashMap::new(); let pkgpath = crate::commands::get_aeropkg_base().join(repo).join(pkgname); full_env.insert("repo".to_string(), repo.clone()); full_env.insert("pkgname".to_string(), pkgname.clone()); full_env.insert("pkgpath".to_string(), pkgpath.to_string_lossy().into_owned()); if let Some(global_env) = get_global_env_string().ok() { full_env.extend(global_env) } if let Some(pkg_env) = get_pkg_env(pkg_md_path).ok() { full_env.extend(pkg_env) } if let Some(repo_env) = get_repo_env(repo).ok() { full_env.extend(repo_env) } if let Some(stage_env) = get_stage_env(stage).ok() { full_env.extend(stage_env) } if let Some(repo_stage_env) = get_repo_and_stage_env(repo, stage).ok() { full_env.extend(repo_stage_env) } full_env.extend(env::vars().map(|(k, v)| (k, v))); return full_env } pub fn get_custom_env(repo: &String, pkgname: &String, pkg_md_path: &Path) -> HashMap { let mut full_env = HashMap::new(); let pkgpath = crate::commands::get_aeropkg_base().join(repo).join(pkgname); full_env.insert("repo".to_string(), repo.clone()); full_env.insert("pkgname".to_string(), pkgname.clone()); full_env.insert("pkgpath".to_string(), pkgpath.to_string_lossy().into_owned()); if let Some(global_env) = get_global_env_string().ok() { full_env.extend(global_env) } if let Some(pkg_env) = get_pkg_env(pkg_md_path).ok() { full_env.extend(pkg_env) } if let Some(repo_env) = get_repo_env(repo).ok() { full_env.extend(repo_env) } full_env.extend(env::vars().map(|(k, v)| (k, v))); return full_env } pub fn get_global_env() -> HashMap { let mut full_env = HashMap::new(); full_env.insert("aeropkg_home".to_string(), crate::commands::get_aeropkg_home().to_string_lossy().into_owned().clone()); full_env.insert("aeropkg_base".to_string(), crate::commands::get_aeropkg_base().to_string_lossy().into_owned().clone()); full_env.insert("pkgbase".to_string(), crate::commands::get_aeropkg_base().to_string_lossy().into_owned().clone()); full_env.insert("aeropkg_etc".to_string(), crate::commands::get_aeropkg_etc().to_string_lossy().into_owned().clone()); full_env.insert("aeropkg_var".to_string(), crate::commands::get_aeropkg_var().to_string_lossy().into_owned().clone()); if let Some(global_env) = get_global_env_string().ok() { full_env.extend(global_env) } return full_env } fn get_global_env_string() -> io::Result> { let cfg_path = crate::commands::get_aeropkg_etc().join("aeropkg.md"); let content = extract_block(&cfg_path, &format!("``` env *** env ***"), "```")?; Ok(parse_env_vars(&content)) } fn parse_env_vars(content: &str) -> HashMap { content .lines() .filter_map(|line| { let line = line.trim(); if line.is_empty() || line.starts_with('#') { return None } let parts: Vec<&str> = line.splitn(2, '=').collect(); if parts.len() != 2 { return None } Some((parts[0].to_string(), parts[1].to_string())) }) .collect() } pub fn get_pkg_env(file_path: &Path) -> io::Result> { let content = extract_block(file_path, "``` env *** env ***", "```")?; Ok(parse_env_vars(&content)) } pub fn get_repo_env(repo: &str) -> io::Result> { let cfg_path = crate::commands::get_aeropkg_etc().join("aeropkg.md"); let content = extract_block(&cfg_path, &format!("``` env *** env {} ***", repo), "```")?; Ok(parse_env_vars(&content)) } pub fn get_stage_env(stage: &str) -> io::Result> { let cfg_path = crate::commands::get_aeropkg_etc().join("aeropkg.md"); let content = extract_block(&cfg_path, &format!("``` env *** env {} ***", stage), "```")?; Ok(parse_env_vars(&content)) } pub fn get_repo_and_stage_env(repo: &str, stage: &str) -> io::Result> { let cfg_path = crate::commands::get_aeropkg_etc().join("aeropkg.md"); let content = extract_block(&cfg_path, &format!("``` env *** env {} {} ***", repo, stage), "```")?; Ok(parse_env_vars(&content)) }