use rayon::prelude::*;
pub fn filter<T: AsRef<str> + Sync>(
items: Vec<std::path::PathBuf>,
target: T,
) -> Vec<std::path::PathBuf> {
let target_str = target.as_ref();
let target_lower = target_str.to_lowercase();
items
.into_par_iter()
.filter(|item| {
item.to_str()
.map(|s| {
if cfg!(target_os = "windows") {
s.to_lowercase().ends_with(&target_lower)
} else {
s.ends_with(target_str)
}
})
.unwrap_or(false)
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
#[test]
fn test_filter_matches() {
let items = vec![
PathBuf::from("/home/user/src/main.rs"),
PathBuf::from("/home/user/src/lib.rs"),
PathBuf::from("/home/user/README.md"),
];
let result = filter(items, "main.rs");
assert_eq!(result.len(), 1);
assert_eq!(result[0], PathBuf::from("/home/user/src/main.rs"));
}
#[test]
fn test_filter_no_match() {
let items = vec![PathBuf::from("/home/user/README.md")];
let result = filter(items, "main.rs");
assert!(result.is_empty());
}
#[test]
fn test_filter_empty_input() {
let result = filter(vec![], "main.rs");
assert!(result.is_empty());
}
#[test]
fn test_filter_multiple_matches() {
let items = vec![
PathBuf::from("/home/user/src/main.rs"),
PathBuf::from("/home/user/backup/main.rs"),
PathBuf::from("/home/user/README.md"),
];
let result = filter(items, "main.rs");
assert_eq!(result.len(), 2);
}
}