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
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, // yes
67                    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 dotfiles and env
86            apply_home_config(&config)?;
87            println!("{}", "User environment applied successfully.".green());
88        }
89    }
90
91    Ok(())
92}