#![deny(missing_docs)]
#![deny(rustdoc::missing_doc_code_examples)]
mod directory_only;
mod file_only;
pub use directory_only::DirectoryOnlyFilter;
pub use file_only::FileOnlyFilter;
use std::fs::DirEntry;
pub trait IgnoreDirEntry {
fn ignore(&self, entry: &DirEntry) -> bool;
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DirEntryFilter {
FileOnly(FileOnlyFilter),
DirectoryOnly(DirectoryOnlyFilter),
}
impl From<FileOnlyFilter> for DirEntryFilter {
fn from(value: FileOnlyFilter) -> Self {
DirEntryFilter::FileOnly(value)
}
}
impl From<DirectoryOnlyFilter> for DirEntryFilter {
fn from(value: DirectoryOnlyFilter) -> Self {
DirEntryFilter::DirectoryOnly(value)
}
}
impl DirEntryFilter {
pub fn new_file() -> Self {
FileOnlyFilter::default().into()
}
pub fn new_directory() -> Self {
DirectoryOnlyFilter::default().into()
}
}
impl IgnoreDirEntry for DirEntryFilter {
fn ignore(&self, entry: &DirEntry) -> bool {
match self {
DirEntryFilter::FileOnly(x) => x.ignore(entry),
DirEntryFilter::DirectoryOnly(x) => x.ignore(entry),
}
}
}
impl<T: AsRef<[DirEntryFilter]>> IgnoreDirEntry for T {
fn ignore(&self, entry: &DirEntry) -> bool {
self.as_ref().iter().any(|filter| filter.ignore(entry))
}
}