| 238 | } |
| 239 | |
| 240 | fn matches(&self, path: &str) -> bool { |
| 241 | let normalized = path.trim_start_matches('/').replace('\\', "/"); |
| 242 | let basename = Path::new(&normalized) |
| 243 | .file_name() |
| 244 | .and_then(|name| name.to_str()) |
| 245 | .unwrap_or(&normalized); |
| 246 | |
| 247 | self.patterns.iter().any(|pattern| { |
| 248 | let pattern = pattern.trim_start_matches('/'); |
| 249 | if let Some(dir) = pattern.strip_suffix('/') { |
| 250 | return normalized == dir |
| 251 | || normalized.starts_with(&format!("{dir}/")) |
| 252 | || normalized.contains(&format!("/{dir}/")); |
| 253 | } |
| 254 | |
| 255 | if let Some(suffix) = pattern.strip_prefix("**/*") { |
| 256 | return normalized.ends_with(suffix); |
| 257 | } |
| 258 | |
| 259 | if let Some(suffix) = pattern.strip_prefix('*') { |
| 260 | return basename.ends_with(suffix); |
| 261 | } |
| 262 | |
| 263 | normalized == pattern || basename == pattern |
| 264 | }) |
| 265 | } |
| 266 | } |
| 267 | |
| 268 | // ═══════════════════════════════════════════════════════════════════════════ |