use std::fmt::Write as _;
use zenops_safe_relative_path::srpath;
use super::common::{
StoredShellConfig, write_aliases, write_brew_llvm_flags, write_environment,
write_path_variable, 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;
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));
write_environment(&mut zshenv, environment);
if let Some(path) = config.path_variable() {
write_path_variable(&mut zshenv, &path);
}
#[cfg(target_os = "macos")]
if config.has_brew_llvm() {
write_brew_llvm_flags(&mut zshenv);
}
config_files.add(
ConfigFilePath::in_home(srpath!(".zshenv")),
ConfigFileSource::Generated(zshenv),
);
#[cfg(target_os = "macos")]
{
let mut zprofile = String::new();
_ = writeln!(zprofile, "#\n# Zsh login profile generated by zenops\n#\n");
_ = writeln!(
zprofile,
"# Homebrew environment (PATH, MANPATH, INFOPATH, fpath)"
);
_ = writeln!(zprofile, "eval \"$(/opt/homebrew/bin/brew shellenv zsh)\"");
config_files.add(
ConfigFilePath::in_home(srpath!(".zprofile")),
ConfigFileSource::Generated(zprofile),
);
}
let mut zshrc = String::new();
_ = writeln!(
zshrc,
"#\n# Zsh interactive config generated by zenops\n#\n"
);
#[cfg(target_os = "macos")]
{
_ = writeln!(zshrc, "# Initialize Zsh completions");
_ = writeln!(zshrc, "autoload -Uz compinit && compinit");
zshrc.push('\n');
}
write_pkg_inits(&mut zshrc, &config.interactive_pkg_inits(Shell::Zsh));
write_aliases(&mut zshrc, alias);
config_files.add(
ConfigFilePath::in_home(srpath!(".zshrc")),
ConfigFileSource::Generated(zshrc),
);
Ok(())
}