use super::ParallelWalker;
use super::dynamic;
use super::visit_worker::visit_serial;
use crate::control::CancellationToken;
use crate::walker::{WalkEntry, WalkError};
#[derive(Debug)]
pub enum WalkEvent<'a> {
Entry(&'a WalkEntry),
Error(&'a WalkError),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WalkControl {
Continue,
Skip,
Quit,
}
#[derive(Debug)]
pub struct ParallelVisitReport {
pub visited: u64,
pub errors: Vec<WalkError>,
pub quit: bool,
pub cancelled: bool,
}
impl ParallelWalker {
pub fn visit<F>(self, visitor: F) -> Result<ParallelVisitReport, WalkError>
where
F: for<'entry> Fn(WalkEvent<'entry>) -> WalkControl + Send + Sync + 'static,
{
self.visit_with_cancellation(&CancellationToken::new(), visitor)
}
pub fn visit_with_cancellation<F>(
mut self,
cancellation: &CancellationToken,
visitor: F,
) -> Result<ParallelVisitReport, WalkError>
where
F: for<'entry> Fn(WalkEvent<'entry>) -> WalkControl + Send + Sync + 'static,
{
self.options = self.options.normalized();
if self.runtime.is_worker_thread() {
visit_serial(
&self.root,
self.options,
self.skip_stdout,
cancellation,
visitor,
)
} else {
dynamic::visit(
&self.root,
self.options,
self.parallelism,
&self.runtime,
self.skip_stdout,
cancellation,
visitor,
)
}
}
}