use std::collections::HashMap;
use crate::config::Config;
use crate::env::{
DotenvConfig, EnvContext, SecretsConfig, ShellConfig, collect_secrets, detect_shell,
generate_dotenv, parse_shell, preview_dotenv, preview_shell_rc, update_shell_rc,
};
use crate::error_codes;
pub fn run_env(
file: &str,
dotenv: bool,
shell: bool,
dry_run: bool,
export: bool,
shell_type: Option<&str>,
force: bool,
) -> i32 {
let config = Config::new(file);
let env_config = config.get_env();
let target_shell = if let Some(shell_str) = shell_type {
match parse_shell(shell_str) {
Ok(s) => s,
Err(e) => {
eprintln!("Error: {}", e);
return error_codes::CONFIG_ERROR;
}
}
} else if let Some(ref shell_str) = env_config.config.shell {
parse_shell(shell_str).unwrap_or_else(|_| detect_shell())
} else {
detect_shell()
};
let ctx = EnvContext::new();
let vars: HashMap<String, String> = env_config
.vars
.iter()
.map(|(k, v)| (k.clone(), v.value().to_string()))
.collect();
if export {
let preview = preview_shell_rc(target_shell, &vars, &ctx);
println!("{}", preview);
return 0;
}
let secrets_config = SecretsConfig::default();
let secrets = match collect_secrets(&env_config.secrets, &ctx, &secrets_config) {
Ok(s) => s,
Err(e) => {
eprintln!("Error collecting secrets: {}", e);
return error_codes::CONFIG_ERROR;
}
};
let secrets_count = secrets.len();
let mut all_vars = vars.clone();
all_vars.extend(secrets);
let do_dotenv = dotenv || (!shell && env_config.config.generate_dotenv);
let do_shell = shell || (!dotenv && env_config.config.update_rc);
if !config.has_env() {
println!("No environment variables configured in {}", file);
return 0;
}
if do_dotenv {
let dotenv_path = &env_config.config.dotenv_path;
if dry_run {
println!(
"=== .env file preview (would be written to {}) ===",
dotenv_path.display()
);
let content = preview_dotenv(&all_vars, &ctx);
println!("{}", content);
} else {
let dotenv_config = DotenvConfig {
backup: true,
force,
add_to_gitignore: env_config.config.add_to_gitignore,
};
match generate_dotenv(dotenv_path, &all_vars, &ctx, &dotenv_config) {
Ok(()) => {
println!("Generated .env file at: {}", dotenv_path.display());
}
Err(e) => {
eprintln!("Failed to generate .env file: {}", e);
if !force {
eprintln!("Tip: Use --force to overwrite existing non-Jarvy .env files");
}
return error_codes::CONFIG_ERROR;
}
}
}
}
if do_shell {
if dry_run {
println!("\n=== Shell rc preview ({}) ===", target_shell);
let preview = preview_shell_rc(target_shell, &vars, &ctx);
println!("{}", preview);
} else {
let shell_config = ShellConfig {
backup: env_config.config.backup_rc,
validate: false,
};
match update_shell_rc(target_shell, &vars, &ctx, &shell_config) {
Ok(path) => {
println!("Updated shell rc file: {}", path.display());
println!(
"Tip: Run 'source {}' or restart your shell to apply changes",
path.display()
);
}
Err(e) => {
eprintln!("Failed to update shell rc file: {}", e);
return error_codes::CONFIG_ERROR;
}
}
}
}
if !dry_run {
println!("\nEnvironment configuration applied:");
println!(" - Variables: {}", vars.len());
if secrets_count > 0 {
println!(" - Secrets: configured");
}
}
0
}