aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs51
1 files changed, 39 insertions, 12 deletions
diff --git a/src/lib.rs b/src/lib.rs
index d9377f5..2b27094 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -9,7 +9,7 @@
//! use which::which;
//! use std::path::PathBuf;
//!
-//! let result = which::which("rustc").unwrap();
+//! let result = which("rustc").unwrap();
//! assert_eq!(result, PathBuf::from("/usr/bin/rustc"));
//!
//! ```
@@ -26,6 +26,8 @@ mod helper;
#[cfg(feature = "regex")]
use regex::Regex;
+#[cfg(feature = "regex")]
+use std::borrow::Borrow;
use std::env;
use std::fmt;
use std::path;
@@ -63,19 +65,27 @@ pub fn which<T: AsRef<OsStr>>(binary_name: T) -> Result<path::PathBuf> {
/// Find all binaries with `binary_name` in the path list `paths`, using `cwd` to resolve relative paths.
pub fn which_all<T: AsRef<OsStr>>(binary_name: T) -> Result<impl Iterator<Item = path::PathBuf>> {
- let cwd = env::current_dir().map_err(|_| Error::CannotGetCurrentDir)?;
+ let cwd = env::current_dir().ok();
+
+ let binary_checker = build_binary_checker();
- which_in_all(binary_name, env::var_os("PATH"), cwd)
+ let finder = Finder::new();
+
+ finder.find(binary_name, env::var_os("PATH"), cwd, binary_checker)
}
/// Find all binaries matching a regular expression in a the system PATH.
///
+/// Only available when feature `regex` is enabled.
+///
/// # Arguments
///
/// * `regex` - A regular expression to match binaries with
///
/// # Examples
///
+/// Find Python executables:
+///
/// ```no_run
/// use regex::Regex;
/// use which::which;
@@ -86,8 +96,18 @@ pub fn which_all<T: AsRef<OsStr>>(binary_name: T) -> Result<impl Iterator<Item =
/// let python_paths = vec![PathBuf::from("/usr/bin/python2"), PathBuf::from("/usr/bin/python3")];
/// assert_eq!(binaries, python_paths);
/// ```
+///
+/// Find all cargo subcommand executables on the path:
+///
+/// ```
+/// use which::which_re;
+/// use regex::Regex;
+///
+/// which_re(Regex::new("^cargo-.*").unwrap()).unwrap()
+/// .for_each(|pth| println!("{}", pth.to_string_lossy()));
+/// ```
#[cfg(feature = "regex")]
-pub fn which_re(regex: Regex) -> Result<impl Iterator<Item = path::PathBuf>> {
+pub fn which_re(regex: impl Borrow<Regex>) -> Result<impl Iterator<Item = path::PathBuf>> {
which_re_in(regex, env::var_os("PATH"))
}
@@ -104,6 +124,8 @@ where
/// Find all binaries matching a regular expression in a list of paths.
///
+/// Only available when feature `regex` is enabled.
+///
/// # Arguments
///
/// * `regex` - A regular expression to match binaries with
@@ -124,13 +146,14 @@ where
/// assert_eq!(binaries, python_paths);
/// ```
#[cfg(feature = "regex")]
-pub fn which_re_in<T>(regex: Regex, paths: Option<T>) -> Result<impl Iterator<Item = path::PathBuf>>
+pub fn which_re_in<T>(
+ regex: impl Borrow<Regex>,
+ paths: Option<T>,
+) -> Result<impl Iterator<Item = path::PathBuf>>
where
T: AsRef<OsStr>,
{
- let binary_checker = CompositeChecker::new()
- .add_checker(Box::new(ExistedChecker::new()))
- .add_checker(Box::new(ExecutableChecker::new()));
+ let binary_checker = build_binary_checker();
let finder = Finder::new();
@@ -148,13 +171,17 @@ where
U: AsRef<OsStr>,
V: AsRef<path::Path>,
{
- let binary_checker = CompositeChecker::new()
- .add_checker(Box::new(ExistedChecker::new()))
- .add_checker(Box::new(ExecutableChecker::new()));
+ let binary_checker = build_binary_checker();
let finder = Finder::new();
- finder.find(binary_name, paths, cwd, binary_checker)
+ finder.find(binary_name, paths, Some(cwd), binary_checker)
+}
+
+fn build_binary_checker() -> CompositeChecker {
+ CompositeChecker::new()
+ .add_checker(Box::new(ExistedChecker::new()))
+ .add_checker(Box::new(ExecutableChecker::new()))
}
/// An owned, immutable wrapper around a `PathBuf` containing the path of an executable.