use std::path::{Path, PathBuf};
pub fn enabled(value: Option<&str>) -> bool {
value.is_some_and(|v| !matches!(v.bytes().next(), None | Some(b'0' | b'f')))
}
pub fn find(dir: &Path, name: &str) -> Option<PathBuf> {
let (sub, base) = match name.rfind('/') {
Some(i) => (&name[..i], &name[i + 1..]),
None => ("", name),
};
let dir = if sub.is_empty() {
dir.to_path_buf()
} else {
PathBuf::from(crate::join(&dir.to_string_lossy(), sub))
};
let mut hits: Vec<PathBuf> = std::fs::read_dir(&dir)
.ok()?
.filter_map(Result::ok)
.filter(|e| {
e.file_name()
.to_str()
.is_some_and(|n| n.eq_ignore_ascii_case(base))
})
.map(|e| {
PathBuf::from(crate::join(
&dir.to_string_lossy(),
&e.file_name().to_string_lossy(),
))
})
.filter(|p| p.is_file())
.collect();
hits.sort();
hits.into_iter().next()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn values() {
for v in ["1", "t", "y", "n", "no", "x"] {
assert!(enabled(Some(v)), "{v}");
}
for v in ["0", "f", "false", ""] {
assert!(!enabled(Some(v)), "{v}");
}
assert!(!enabled(None));
}
}