use anyhow::{Result, anyhow};
use clap::{Parser, Subcommand};
use colored::*;
use zoi_core::utils::is_zoios;
use zoi_system::home::{apply_home_config, load_home_lua};
#[derive(Parser, Debug)]
pub struct HomeCommand {
#[command(subcommand)]
pub command: HomeSubcommands,
}
#[derive(Subcommand, Debug)]
pub enum HomeSubcommands {
Apply {
#[arg(short, long)]
file: Option<String>,
},
}
pub fn run(args: HomeCommand) -> Result<()> {
if !is_zoios() {
return Err(anyhow!(
"'zoi home' features are only available on ZoiOS systems."
));
}
match args.command {
HomeSubcommands::Apply { file } => {
let config_path = file.unwrap_or_else(|| {
let mut p = crate::pkg::utils::get_user_home().unwrap();
p.push(".config/zoi/home.lua");
p.to_string_lossy().to_string()
});
println!("Reading user configuration from {}...", config_path.cyan());
let config = load_home_lua(&config_path)?;
if !config.packages.is_empty() {
println!(
"{} Installing {} user packages...",
"::".bold().blue(),
config.packages.len().to_string().cyan()
);
let project_config = zoi_project::config::ProjectConfig {
name: "home".to_string(),
registries: std::collections::HashMap::new(),
packages: Vec::new(),
pkgs: config.packages.clone(),
pkgs_v2: config.packages_v2.clone(),
config: zoi_project::config::ProjectLocalConfig::default(),
commands: Vec::new(),
environments: Vec::new(),
shell: Some(zoi_project::config::ShellSpec::default()),
};
crate::cmd::install::run(
&config.packages,
None,
false,
false,
true, Some(crate::cli::InstallScope::User),
false,
false,
false,
None,
false,
None,
false,
false,
false,
false,
3,
false,
false,
Some(project_config),
)?;
}
apply_home_config(&config)?;
println!("{}", "User environment applied successfully.".green());
}
}
Ok(())
}