use std::path::Path; use crate::common::Common; #[cfg(target_family = "unix")] pub const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["/proc", "/dev", "/sys", "/run", "/snap"]; #[cfg(not(target_family = "unix"))] pub const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["C:\\Windows"]; #[cfg(target_family = "unix")] pub const DEFAULT_EXCLUDED_ITEMS: &str = "*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*,*/.Trash-*/*,*/snap/*,/home/*/.cache/*"; #[cfg(not(target_family = "unix"))] pub const DEFAULT_EXCLUDED_ITEMS: &str = "*\\.git\\*,*\\node_modules\\*,*\\lost+found\\*,*:\\windows\\*,*:\\$RECYCLE.BIN\\*,*:\\$SysReset\\*,*:\\System Volume Information\\*,*:\\OneDriveTemp\\*,*:\\hiberfil.sys,*:\\pagefile.sys,*:\\swapfile.sys"; #[derive(Debug, Clone, Default)] pub struct ExcludedItems { pub items: Vec, } impl ExcludedItems { pub fn new() -> Self { Default::default() } pub fn set_excluded_items(&mut self, excluded_items: Vec) -> (Vec, Vec, Vec) { let messages: Vec = Vec::new(); let mut warnings: Vec = Vec::new(); let errors: Vec = Vec::new(); if excluded_items.is_empty() { return (messages, warnings, errors); } let expressions: Vec = excluded_items; let mut checked_expressions: Vec = Vec::new(); for expression in expressions { let expression: String = expression.trim().to_string(); if expression.is_empty() { continue; } #[cfg(target_family = "windows")] let expression = expression.replace("/", "\\"); if expression == "DEFAULT" { checked_expressions.push(DEFAULT_EXCLUDED_ITEMS.to_string()); continue; } if !expression.contains('*') { warnings.push("Excluded Items Warning: Wildcard * is required in expression, ignoring ".to_string() + expression.as_str()); continue; } checked_expressions.push(expression); } self.items = checked_expressions; (messages, warnings, errors) } pub fn is_excluded(&self, path: impl AsRef) -> bool { #[cfg(target_family = "windows")] let path = Common::normalize_windows_path(path); for expression in &self.items { if Common::regex_check(expression, &path) { return true; } } false } }