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 crate::cmd::install::run(
49 &config.packages,
50 None,
51 false,
52 false,
53 true, Some(crate::cli::InstallScope::User),
55 false,
56 false,
57 false,
58 None,
59 false,
60 None,
61 false,
62 false,
63 false,
64 false,
65 3,
66 false,
67 false,
68 )?;
69 }
70
71 apply_home_config(&config)?;
73 println!("{}", "User environment applied successfully.".green());
74 }
75 }
76
77 Ok(())
78}