use crate::internals::helpers::err_write;
use std::io::Write;
use std::process::{Command, Stdio};
#[inline]
pub fn cd<E: Write>(dir: &str, hook: &str, stderr: &mut E, err_continue: bool) {
if hook == "default" || hook == "" {
let _ = std::env::set_current_dir(&dir);
} else {
let output = Command::new(hook)
.arg("cd")
.arg(dir)
.stdin(Stdio::inherit())
.stdout(Stdio::piped())
.stderr(Stdio::inherit())
.output()
.expect("Failed to start");
if output.status.success() {
let path = String::from_utf8_lossy(&output.stdout);
let path = path.trim();
if !path.is_empty() {
if let Err(e) = std::env::set_current_dir(path) {
err_write("cd hook failed to work", stderr);
let _ = write!(stderr, "{e}");
if err_continue == false {
std::process::exit(1);
}
}
}
} else {
err_write("cd hook failed to give proper directory", stderr);
if err_continue == false {
std::process::exit(1);
} else {
let _ = write!(stderr, "falling back to builtin cd");
let _ = std::env::set_current_dir(&dir);
}
}
}
}