You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

54 lines
1.5 KiB

use crate::version_file_strategy::VersionFileStrategy;
use super::shell::Shell;
use indoc::{formatdoc, indoc};
use std::path::Path;
#[derive(Debug)]
pub struct Bash;
impl Shell for Bash {
fn to_clap_shell(&self) -> clap_complete::Shell {
clap_complete::Shell::Bash
}
fn path(&self, path: &Path) -> anyhow::Result<String> {
let path = path
.to_str()
.ok_or_else(|| anyhow::anyhow!("Can't convert path to string"))?;
Ok(format!("export PATH={:?}:$PATH", path))
}
fn set_env_var(&self, name: &str, value: &str) -> String {
format!("export {}={:?}", name, value)
}
fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result<String> {
let autoload_hook = match config.version_file_strategy() {
VersionFileStrategy::Local => indoc!(
r#"
if [[ -f .node-version || -f .nvmrc ]]; then
fnm use --silent-if-unchanged
fi
"#
),
VersionFileStrategy::Recursive => r#"fnm use --silent-if-unchanged"#,
};
Ok(formatdoc!(
r#"
__fnm_use_if_file_found() {{
{autoload_hook}
}}
__fnmcd() {{
\cd "$@" || return $?
__fnm_use_if_file_found
}}
alias cd=__fnmcd
__fnm_use_if_file_found
"#,
autoload_hook = autoload_hook
))
}
}