use std::path::PathBuf;
mod scan;
use crate::helpers::dir_node::DirNode;
use crate::helpers::recurse::Recurse;
use crate::helpers::sort::SortOrder;
use crate::helpers::walk_error::WalkError;
use crate::helpers::walk_report::WalkReport;
#[cfg(feature = "filter")]
use crate::helpers::filter::FilterRule;
const MAX_THREADS: usize = 8;
#[derive(Clone, Debug)]
pub struct Swdir {
root_path: PathBuf,
recurse: Recurse,
max_threads: usize,
sort_order: SortOrder,
#[cfg(feature = "filter")]
filters: Vec<FilterRule>,
}
impl Swdir {
pub fn new() -> Self {
#[cfg(feature = "filter")]
{
Self {
root_path: PathBuf::from("."),
max_threads: MAX_THREADS,
recurse: Recurse::default(),
sort_order: SortOrder::default(),
filters: vec![FilterRule::SkipHidden],
}
}
#[cfg(not(feature = "filter"))]
{
Self {
root_path: PathBuf::from("."),
max_threads: MAX_THREADS,
recurse: Recurse::default(),
sort_order: SortOrder::default(),
}
}
}
pub fn root_path<P: Into<PathBuf>>(mut self, path: P) -> Self {
self.root_path = path.into();
self
}
pub fn recurse(mut self, recurse: Recurse) -> Self {
self.recurse = recurse;
self
}
pub fn max_threads(mut self, n: usize) -> Self {
self.max_threads = n.max(1);
self
}
pub fn sort_order(mut self, order: SortOrder) -> Self {
self.sort_order = order;
self
}
#[cfg(feature = "filter")]
pub fn filter(mut self, rule: FilterRule) -> Self {
self.filters.push(rule);
self
}
#[cfg(feature = "filter")]
pub fn filters<I: IntoIterator<Item = FilterRule>>(mut self, rules: I) -> Self {
self.filters.extend(rules);
self
}
#[cfg(feature = "filter")]
pub fn clear_filters(mut self) -> Self {
self.filters.clear();
self
}
#[cfg(feature = "filter")]
pub fn filter_rules(&self) -> &[FilterRule] {
&self.filters
}
pub fn recurse_policy(&self) -> Recurse {
self.recurse
}
pub fn sort_order_policy(&self) -> SortOrder {
self.sort_order
}
pub fn walk(&self) -> WalkReport {
let mut errors: Vec<WalkError> = Vec::new();
let tree = self.walk_parallel(&mut errors);
WalkReport { tree, errors }
}
pub fn walk_tree(&self) -> DirNode {
self.walk().tree
}
}
impl Default for Swdir {
fn default() -> Self {
Self::new()
}
}