use crate::config::Config; use std::path::Path;
pub(crate) fn passes_extension_filters(path: &Path, config: &Config) -> bool {
let extension = path
.extension()
.and_then(|os_str| os_str.to_str())
.map(|s| s.to_lowercase());
if let Some(ref exclude_exts) = config.exclude_extensions {
if let Some(ref ext) = extension {
if exclude_exts.contains(ext) {
return false; }
}
}
if let Some(ref include_exts) = config.extensions {
if let Some(ref ext) = extension {
if !include_exts.contains(ext) {
return false; }
} else {
return false; }
}
true }
#[cfg(test)]
mod tests {
use super::*;
use crate::config::Config; use std::path::Path;
fn create_test_config(
extensions: Option<Vec<&str>>,
exclude_extensions: Option<Vec<&str>>,
) -> Config {
let mut config = Config::new_for_test();
config.extensions = extensions.map(|v| v.iter().map(|s| s.to_lowercase()).collect());
config.exclude_extensions =
exclude_extensions.map(|v| v.iter().map(|s| s.to_lowercase()).collect());
config
}
#[test]
fn test_ext_no_filters() {
let config = create_test_config(None, None);
assert!(passes_extension_filters(Path::new("file.txt"), &config));
assert!(passes_extension_filters(Path::new("file.rs"), &config));
assert!(passes_extension_filters(Path::new("file"), &config)); }
#[test]
fn test_ext_include() {
let config = create_test_config(Some(vec!["txt", "md"]), None);
assert!(passes_extension_filters(Path::new("file.txt"), &config));
assert!(passes_extension_filters(Path::new("FILE.MD"), &config)); assert!(!passes_extension_filters(Path::new("file.rs"), &config));
assert!(!passes_extension_filters(Path::new("file"), &config)); }
#[test]
fn test_ext_exclude() {
let config = create_test_config(None, Some(vec!["log", "tmp"]));
assert!(passes_extension_filters(Path::new("file.txt"), &config));
assert!(!passes_extension_filters(Path::new("file.log"), &config));
assert!(!passes_extension_filters(Path::new("file.TMP"), &config)); assert!(passes_extension_filters(Path::new("file"), &config)); }
#[test]
fn test_ext_include_and_exclude() {
let config = create_test_config(Some(vec!["txt", "md"]), Some(vec!["bak", "md"])); assert!(passes_extension_filters(Path::new("file.txt"), &config)); assert!(!passes_extension_filters(Path::new("file.md"), &config)); assert!(!passes_extension_filters(Path::new("file.bak"), &config)); assert!(!passes_extension_filters(Path::new("file.rs"), &config)); }
}