Skip to main content

zoi_cli/cmd/
home.rs

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 a declarative user configuration from home.lua
16    Apply {
17        /// Path to the home configuration file
18        #[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            // Install user packages
42            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, // yes
54                    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 dotfiles and env
72            apply_home_config(&config)?;
73            println!("{}", "User environment applied successfully.".green());
74        }
75    }
76
77    Ok(())
78}