|
|
@ -1,6 +1,5 @@
|
|
|
|
pub use which::which;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use std::{
|
|
|
|
use std::{
|
|
|
|
|
|
|
|
ffi::OsStr,
|
|
|
|
path::{Path, PathBuf},
|
|
|
|
path::{Path, PathBuf},
|
|
|
|
sync::RwLock,
|
|
|
|
sync::RwLock,
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -36,10 +35,33 @@ pub fn env_var_is_set(env_var_name: &str) -> bool {
|
|
|
|
std::env::var_os(env_var_name).is_some()
|
|
|
|
std::env::var_os(env_var_name).is_some()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn binary_exists(binary_name: &str) -> bool {
|
|
|
|
pub fn binary_exists<T: AsRef<OsStr>>(binary_name: T) -> bool {
|
|
|
|
which::which(binary_name).is_ok()
|
|
|
|
which::which(binary_name).is_ok()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn which<T: AsRef<OsStr>>(
|
|
|
|
|
|
|
|
binary_name: T,
|
|
|
|
|
|
|
|
) -> Result<std::path::PathBuf, ExecutableNotFoundError> {
|
|
|
|
|
|
|
|
which::which(binary_name.as_ref()).map_err(|err| ExecutableNotFoundError {
|
|
|
|
|
|
|
|
command: binary_name.as_ref().to_string_lossy().into_owned(),
|
|
|
|
|
|
|
|
inner: err,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
|
|
|
pub struct ExecutableNotFoundError {
|
|
|
|
|
|
|
|
command: String,
|
|
|
|
|
|
|
|
inner: which::Error,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl std::fmt::Display for ExecutableNotFoundError {
|
|
|
|
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
|
|
|
|
write!(f, "command '{}' not found: {}", self.command, self.inner)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl std::error::Error for ExecutableNotFoundError {}
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
mod tests {
|
|
|
|
use super::{current_working_dir, set_current_working_dir};
|
|
|
|
use super::{current_working_dir, set_current_working_dir};
|
|
|
|