Skip to content

Commit 84e152e

Browse files
authored
reduce sys::Sys requirements, add some tracing for otherwise silent errors (#114)
* reduce sys::Sys requirements, add some tracing for otherwise silent errors * disable incorrect lint * WIP: TODO: rewrite regex iterator * finish regex implementation --------- Co-authored-by: Jacob Kiesel <[email protected]>
1 parent a0a6daf commit 84e152e

File tree

6 files changed

+382
-320
lines changed

6 files changed

+382
-320
lines changed

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ keywords = ["which", "which-rs", "unix", "command"]
1616
default = ["real-sys"]
1717
regex = ["dep:regex"]
1818
tracing = ["dep:tracing"]
19-
real-sys = ["env_home", "rustix", "winsafe"]
19+
real-sys = ["dep:env_home", "dep:rustix", "dep:winsafe"]
2020

2121
[dependencies]
22-
either = "1.9.0"
2322
regex = { version = "1.10.2", optional = true }
2423
tracing = { version = "0.1.40", default-features = false, optional = true }
2524

src/checker.rs

Lines changed: 31 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,42 @@
1-
use crate::finder::Checker;
21
use crate::sys::Sys;
32
use crate::sys::SysMetadata;
43
use crate::{NonFatalError, NonFatalErrorHandler};
54
use std::path::Path;
65

7-
pub struct ExecutableChecker<TSys: Sys> {
8-
sys: TSys,
6+
pub fn is_valid<F: NonFatalErrorHandler>(
7+
sys: impl Sys,
8+
path: &Path,
9+
nonfatal_error_handler: &mut F,
10+
) -> bool {
11+
exists(&sys, path, nonfatal_error_handler) && is_executable(&sys, path, nonfatal_error_handler)
912
}
1013

11-
impl<TSys: Sys> ExecutableChecker<TSys> {
12-
pub fn new(sys: TSys) -> Self {
13-
Self { sys }
14+
fn is_executable<F: NonFatalErrorHandler>(
15+
sys: impl Sys,
16+
path: &Path,
17+
nonfatal_error_handler: &mut F,
18+
) -> bool {
19+
if sys.is_windows() && path.extension().is_some() {
20+
true
21+
} else {
22+
let ret = sys
23+
.is_valid_executable(path)
24+
.map_err(|e| nonfatal_error_handler.handle(NonFatalError::Io(e)))
25+
.unwrap_or(false);
26+
#[cfg(feature = "tracing")]
27+
tracing::trace!("{} EXEC_OK = {ret}", path.display());
28+
ret
1429
}
1530
}
1631

17-
impl<TSys: Sys> Checker for ExecutableChecker<TSys> {
18-
fn is_valid<F: NonFatalErrorHandler>(
19-
&self,
20-
path: &Path,
21-
nonfatal_error_handler: &mut F,
22-
) -> bool {
23-
if self.sys.is_windows() && path.extension().is_some() {
24-
true
25-
} else {
26-
let ret = self
27-
.sys
28-
.is_valid_executable(path)
29-
.map_err(|e| nonfatal_error_handler.handle(NonFatalError::Io(e)))
30-
.unwrap_or(false);
31-
#[cfg(feature = "tracing")]
32-
tracing::trace!("{} EXEC_OK = {ret}", path.display());
33-
ret
34-
}
35-
}
36-
}
37-
38-
pub struct ExistedChecker<TSys: Sys> {
39-
sys: TSys,
40-
}
41-
42-
impl<TSys: Sys> ExistedChecker<TSys> {
43-
pub fn new(sys: TSys) -> Self {
44-
Self { sys }
45-
}
46-
}
47-
48-
impl<TSys: Sys> Checker for ExistedChecker<TSys> {
49-
fn is_valid<F: NonFatalErrorHandler>(
50-
&self,
51-
path: &Path,
52-
nonfatal_error_handler: &mut F,
53-
) -> bool {
54-
if self.sys.is_windows() {
55-
let ret = self
56-
.sys
32+
fn exists<F: NonFatalErrorHandler>(
33+
sys: impl Sys,
34+
path: &Path,
35+
nonfatal_error_handler: &mut F,
36+
) -> bool {
37+
{
38+
if sys.is_windows() {
39+
let ret = sys
5740
.symlink_metadata(path)
5841
.map(|metadata| {
5942
#[cfg(feature = "tracing")]
@@ -71,13 +54,13 @@ impl<TSys: Sys> Checker for ExistedChecker<TSys> {
7154
.unwrap_or(false);
7255
#[cfg(feature = "tracing")]
7356
tracing::trace!(
74-
"{} has_extension = {}, ExistedChecker::is_valid() = {ret}",
57+
"{} has_extension = {}, checker::exists() = {ret}",
7558
path.display(),
7659
path.extension().is_some()
7760
);
7861
ret
7962
} else {
80-
let ret = self.sys.metadata(path).map(|metadata| metadata.is_file());
63+
let ret = sys.metadata(path).map(|metadata| metadata.is_file());
8164
#[cfg(feature = "tracing")]
8265
tracing::trace!("{} is_file() = {ret:?}", path.display());
8366
match ret {
@@ -90,30 +73,3 @@ impl<TSys: Sys> Checker for ExistedChecker<TSys> {
9073
}
9174
}
9275
}
93-
94-
pub struct CompositeChecker<TSys: Sys> {
95-
existed_checker: ExistedChecker<TSys>,
96-
executable_checker: ExecutableChecker<TSys>,
97-
}
98-
99-
impl<TSys: Sys> CompositeChecker<TSys> {
100-
pub fn new(sys: TSys) -> Self {
101-
CompositeChecker {
102-
executable_checker: ExecutableChecker::new(sys.clone()),
103-
existed_checker: ExistedChecker::new(sys),
104-
}
105-
}
106-
}
107-
108-
impl<TSys: Sys> Checker for CompositeChecker<TSys> {
109-
fn is_valid<F: NonFatalErrorHandler>(
110-
&self,
111-
path: &Path,
112-
nonfatal_error_handler: &mut F,
113-
) -> bool {
114-
self.existed_checker.is_valid(path, nonfatal_error_handler)
115-
&& self
116-
.executable_checker
117-
.is_valid(path, nonfatal_error_handler)
118-
}
119-
}

0 commit comments

Comments
 (0)