zenops 0.8.3

Declarative system configuration management for shell config and dotfiles.
Documentation
use std::fmt::Write as _;
use zenops_safe_relative_path::srpath;

use super::common::{StoredShellConfig, write_aliases, write_environment, write_pkg_inits};
use crate::{
    config::{Config, pkg::Shell},
    config_files::{ConfigFilePath, ConfigFileSource, ConfigFiles},
    error::Error,
};

pub(in super::super) type StoredZshConfig = StoredShellConfig;

pub(super) fn make_config_files(
    shell_config: &StoredShellConfig,
    config: &Config,
    config_files: &mut ConfigFiles,
) -> Result<(), Error> {
    let StoredShellConfig { environment, alias } = shell_config;

    // ~/.zshenv — sourced for every shell invocation
    let mut zshenv = String::new();
    _ = writeln!(
        zshenv,
        "#\n# Zsh environment config generated by zenops\n#\n"
    );

    write_pkg_inits(
        &mut zshenv,
        &config.env_pkg_inits(Shell::Zsh),
        config.system_inputs(),
    )?;

    write_environment(&mut zshenv, environment);

    config_files.add(
        ConfigFilePath::in_home(srpath!(".zshenv")),
        ConfigFileSource::Generated(zshenv),
    );

    // ~/.zprofile — sourced only for login shells (macOS convention).
    // Emitted only when some pkg contributes a zsh login action.
    let login_inits = config.login_pkg_inits(Shell::Zsh);
    if !login_inits.is_empty() {
        let mut zprofile = String::new();
        _ = writeln!(zprofile, "#\n# Zsh login profile generated by zenops\n#\n");
        write_pkg_inits(&mut zprofile, &login_inits, config.system_inputs())?;

        config_files.add(
            ConfigFilePath::in_home(srpath!(".zprofile")),
            ConfigFileSource::Generated(zprofile),
        );
    }

    // ~/.zshrc — sourced for interactive shells
    let mut zshrc = String::new();
    _ = writeln!(
        zshrc,
        "#\n# Zsh interactive config generated by zenops\n#\n"
    );

    write_pkg_inits(
        &mut zshrc,
        &config.interactive_pkg_inits(Shell::Zsh),
        config.system_inputs(),
    )?;

    write_aliases(&mut zshrc, alias);

    config_files.add(
        ConfigFilePath::in_home(srpath!(".zshrc")),
        ConfigFileSource::Generated(zshrc),
    );

    Ok(())
}