use std::{fs::Metadata, time::SystemTime};
#[derive(Clone, Debug)]
pub enum FileType {
File,
Dir,
Symlink,
}
#[derive(Clone, Debug)]
pub struct Predicates {
pub min_size: Option<u64>,
pub max_size: Option<u64>,
pub file_type: Option<FileType>,
pub mtime_after: Option<SystemTime>,
pub mtime_before: Option<SystemTime>,
pub ctime_after: Option<SystemTime>,
pub ctime_before: Option<SystemTime>,
pub follow_symlinks: bool,
}
impl Predicates {
pub fn matches(&self, meta: &Metadata) -> bool {
if let Some(min) = self.min_size {
if meta.len() < min {
return false;
}
}
if let Some(max) = self.max_size {
if meta.len() > max {
return false;
}
}
if let Some(ft) = &self.file_type {
match ft {
FileType::File if !meta.is_file() => return false,
FileType::Dir if !meta.is_dir() => return false,
FileType::Symlink if !meta.file_type().is_symlink() => return false,
_ => {}
}
}
if let Ok(mtime) = meta.modified() {
if let Some(after) = self.mtime_after {
if mtime < after {
return false;
}
}
if let Some(before) = self.mtime_before {
if mtime > before {
return false;
}
}
}
if let Ok(ctime) = meta.created() {
if let Some(after) = self.ctime_after {
if ctime < after {
return false;
}
}
if let Some(before) = self.ctime_before {
if ctime > before {
return false;
}
}
}
true
}
}