zenops 0.9.0

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 StoredBashConfig = StoredShellConfig;

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

    _ = writeln!(
        bash_config,
        "#\n# Bash config generated by zenops.\n# Source this from ~/.bash_profile on macOS or ~/.bashrc on Linux.\n#\n"
    );

    write_pkg_inits(
        &mut bash_config,
        &config.env_pkg_inits(Shell::Bash),
        config.system_inputs(),
    )?;

    write_pkg_inits(
        &mut bash_config,
        &config.login_pkg_inits(Shell::Bash),
        config.system_inputs(),
    )?;

    write_aliases(&mut bash_config, alias);
    write_environment(&mut bash_config, environment);

    write_pkg_inits(
        &mut bash_config,
        &config.interactive_pkg_inits(Shell::Bash),
        config.system_inputs(),
    )?;

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

    Ok(())
}