1use anyhow::{Result, anyhow};
2use clap::{Parser, Subcommand};
3use colored::*;
4use zoi_core::utils::is_zoios;
5use zoi_system::home::{apply_home_config, load_home_lua};
6
7#[derive(Parser, Debug)]
8pub struct HomeCommand {
9 #[command(subcommand)]
10 pub command: HomeSubcommands,
11}
12
13#[derive(Subcommand, Debug)]
14pub enum HomeSubcommands {
15 Apply {
17 #[arg(short, long)]
19 file: Option<String>,
20 },
21}
22
23pub fn run(args: HomeCommand) -> Result<()> {
24 if !is_zoios() {
25 return Err(anyhow!(
26 "'zoi home' features are only available on ZoiOS systems."
27 ));
28 }
29
30 match args.command {
31 HomeSubcommands::Apply { file } => {
32 let config_path = file.unwrap_or_else(|| {
33 let mut p = crate::pkg::utils::get_user_home().unwrap();
34 p.push(".config/zoi/home.lua");
35 p.to_string_lossy().to_string()
36 });
37
38 println!("Reading user configuration from {}...", config_path.cyan());
39 let config = load_home_lua(&config_path)?;
40
41 if !config.packages.is_empty() {
43 println!(
44 "{} Installing {} user packages...",
45 "::".bold().blue(),
46 config.packages.len().to_string().cyan()
47 );
48
49 let project_config = zoi_project::config::ProjectConfig {
50 name: "home".to_string(),
51 registries: std::collections::HashMap::new(),
52 packages: Vec::new(),
53 pkgs: config.packages.clone(),
54 pkgs_v2: config.packages_v2.clone(),
55 config: zoi_project::config::ProjectLocalConfig::default(),
56 commands: Vec::new(),
57 environments: Vec::new(),
58 shell: Some(zoi_project::config::ShellSpec::default()),
59 };
60
61 crate::cmd::install::run(
62 &config.packages,
63 None,
64 false,
65 false,
66 true, Some(crate::cli::InstallScope::User),
68 false,
69 false,
70 false,
71 None,
72 false,
73 None,
74 false,
75 false,
76 false,
77 false,
78 3,
79 false,
80 false,
81 Some(project_config),
82 )?;
83 }
84
85 apply_home_config(&config)?;
87 println!("{}", "User environment applied successfully.".green());
88 }
89 }
90
91 Ok(())
92}