1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//! This crate provides functions that can be used to search for an
//! executable based on the PATH environment on both POSIX and Windows
//! systems.
//!
//! `find_executable_in_path` is the most convenient function exported
//! by this crate; given the name of an executable, it will yield the
//! absolute path of the first matching file.
//!
//! ```
//! use pathsearch::find_executable_in_path;
//!
//! if let Some(exe) = find_executable_in_path("ls") {
//! println!("Found ls at {}", exe.display());
//! }
//! ```
//!
//! `PathSearcher` is platform-independent struct that encompasses the
//! path searching algorithm used by `find_executable_in_path`. Construct
//! it by passing in the PATH and PATHEXT (for Windows) environment variables
//! and iterate it to incrementally produce all candidate results. This
//! is useful when implementing utilities such as `which` that want to show
//! all possible paths.
//!
//! ```
//! use pathsearch::PathSearcher;
//! use std::ffi::OsString;
//!
//! let path = std::env::var_os("PATH");
//! let path_ext = std::env::var_os("PATHEXT");
//!
//! for exe in PathSearcher::new(
//! "zsh",
//! path.as_ref().map(OsString::as_os_str),
//! path_ext.as_ref().map(OsString::as_os_str),
//! ) {
//! println!("{}", exe.display());
//! }
//! ```
//!
//! `SimplePathSearcher` is a simple iterator that can be used to search
//! an arbitrary path for an arbitrary file that doesn't have to be executable.
use ;
use PathBuf;
/// SimplePathSearcher is an iterator that yields candidate PathBuf inthstances
/// generated from searching the supplied path string following the
/// standard rules: explode path by the system path separator character
/// and then for each entry, concatenate the candidate command and test
/// whether that is a file.
pub type PathSearcher<'a> = ExecutablePathSearcher;
pub type PathSearcher<'a> = WindowsPathSearcher;
/// Resolves the first matching candidate command from the current
/// process environment using the platform appropriate rules.
/// On Unix systems this will search the PATH environment variable
/// for an executable file.
/// On Windows systems this will search each entry in PATH and
/// return the first file that has an extension listed in the PATHEXT
/// environment variable.
Sized>