pub struct Dowser { /* private fields */ }
Expand description
§Dowser.
Dowser
is a very simple recursive file iterator. Symlinks and hidden
nodes are followed like any other, and all results are canonicalized and
deduped prior to yielding.
§Usage
All you need to do is chain Dowser::default
with one or more of the
following seed methods:
The with_*
methods add sources to be crawled, while the without_*
methods shitlist sources, preventing them from being yielded by the
iterator.
If using without_*
, be sure to chain those first, before any with_*
calls, just in case your withs and withouts overlap. ;)
From there, you can do your normal Iterator
business, or if you just want to
collect the results into a vector, call Dowser::into_vec
or Dowser::into_vec_filtered
.
§Examples
use dowser::Dowser;
use std::path::PathBuf;
let files: Vec<PathBuf> = Dowser::default()
.with_path("/usr/share")
// You could filter_map(), etc., here, with the understanding that
// every path you get will belong to a valid, canonical file.
.collect();
Implementations§
source§impl Dowser
impl Dowser
sourcepub fn with_path<P>(self, path: P) -> Self
pub fn with_path<P>(self, path: P) -> Self
§With Path.
Queue up a single file or directory path.
This can be called multiple times, but Dowser::with_paths
probably
makes more sense when you want to crawl multiple roots.
§Examples
use dowser::Dowser;
use std::path::PathBuf;
let files: Vec::<PathBuf> = Dowser::default()
.with_path("/my/dir")
.collect();
sourcepub fn with_paths<P, I>(self, paths: I) -> Self
pub fn with_paths<P, I>(self, paths: I) -> Self
§With Paths.
Queue up multiple file and/or directory paths.
§Examples
use dowser::Dowser;
use std::path::PathBuf;
let files: Vec::<PathBuf> = Dowser::default()
.with_paths(&["/my/dir"])
.collect();
§Panics
This will panic if you try to pass a single Path
or PathBuf
object
directly to this method (instead of a collection of same). Use
Dowser::with_path
to add such an object directly.
source§impl Dowser
impl Dowser
sourcepub fn without_path<P>(self, path: P) -> Self
pub fn without_path<P>(self, path: P) -> Self
§Without Path.
This will prevent the provided directory or file from being crawled or included in the output.
Note: without-path(s) should be specified before with-path(s), just in case the sets overlap.
§Examples
use dowser::Dowser;
use std::path::PathBuf;
let files: Vec<PathBuf> = Dowser::default()
.without_path("/my/dir/ignore")
.with_path("/my/dir")
.collect();
sourcepub fn without_paths<P, I>(self, paths: I) -> Self
pub fn without_paths<P, I>(self, paths: I) -> Self
§Without Paths.
This will prevent the provided directories or files from being crawled or included in the output.
Note: without-path(s) should be specified before with-path(s), just in case the sets overlap.
§Examples
use dowser::Dowser;
use std::path::PathBuf;
let files: Vec<PathBuf> = Dowser::default()
.without_paths(&["/my/dir/ignore"])
.with_path("/my/dir")
.collect();
§Panics
This will panic if you try to pass a single Path
or PathBuf
object
directly to this method (instead of a collection of same). Use
Dowser::without_path
to add such an object directly.
source§impl Dowser
impl Dowser
sourcepub fn into_vec(self) -> Vec<PathBuf>
pub fn into_vec(self) -> Vec<PathBuf>
§Consume Into Vec.
This method is an optimized alternative to running
Dowser.iter().collect::<Vec<PathBuf>>()
.
It yields the same results as the above, but makes fewer allocations along the way.
§Examples
use dowser::Dowser;
use std::path::PathBuf;
// The iterator way.
let files: Vec<PathBuf> = Dowser::default()
.with_path("/usr/share")
.collect();
// The optimized way.
let files: Vec<PathBuf> = Dowser::default()
.with_path("/usr/share")
.into_vec();
sourcepub fn into_vec_filtered<F>(self, cb: F) -> Vec<PathBuf>
pub fn into_vec_filtered<F>(self, cb: F) -> Vec<PathBuf>
§Consume Into Vec (Filtered).
This method is an optimized alternative to running
Dowser.iter().filter(…).collect::<Vec<PathBuf>>()
.
It yields the same results as the above, but makes fewer allocations along the way.
Note: every entry passed to your callback will be a valid, canonical
file path. (You don’t have to explicitly test for is_file
or
anything like that.)
§Examples
use dowser::Dowser;
use std::path::PathBuf;
// The iterator way.
let files: Vec<PathBuf> = Dowser::default()
.with_path("/usr/share")
.filter(|p|
p.extension().map_or(
false,
|e| e.eq_ignore_ascii_case("jpg")
)
)
.collect();
// The optimized way.
let files: Vec<PathBuf> = Dowser::default()
.with_path("/usr/share")
.into_vec_filtered(|p|
p.extension().map_or(
false,
|e| e.eq_ignore_ascii_case("jpg")
)
);
Trait Implementations§
source§impl Iterator for Dowser
impl Iterator for Dowser
source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
§Next!
This iterator yields canonical, deduplicated file paths. Directories are recursively traversed, but their paths are not returned.
Note: item ordering is arbitrary and likely to change from run-to-run.
source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
§Size Hints.
This iterator has an unknown size until the final directory has been read, after which point it is just a matter of flushing the files it found there.
source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk
)N
values. Read more1.0.0 · source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by
)n
elements. Read more1.0.0 · source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
n
th element of the iterator. Read more1.28.0 · source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 · source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 · source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
iter_intersperse
)separator
between adjacent
items of the original iterator. Read moresource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse
)separator
between adjacent items of the original iterator. Read more1.0.0 · source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 · source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 · source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 · source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n
elements. Read more1.0.0 · source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n
elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows
)f
for each contiguous window of size N
over
self
and returns an iterator over the outputs of f
. Like slice::windows()
,
the windows during mapping overlap as well. Read more1.0.0 · source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into
)1.0.0 · source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned
)true
precede all those that return false
. Read more1.27.0 · source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
source§fn try_reduce<F, R>(
&mut self,
f: F,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<F, R>( &mut self, f: F, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce
)1.0.0 · source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
source§fn try_find<F, R>(
&mut self,
f: F,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<F, R>( &mut self, f: F, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find
)1.0.0 · source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks
)N
elements of the iterator at a time. Read more1.11.0 · source§fn product<P>(self) -> P
fn product<P>(self) -> P
source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read more1.5.0 · source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd
elements of
this Iterator
with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moresource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read moresource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by
)1.5.0 · source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator
are lexicographically
less than those of another. Read more1.5.0 · source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator
are lexicographically
less or equal to those of another. Read more1.5.0 · source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than those of another. Read more1.5.0 · source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than or equal to those of another. Read moresource§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
is_sorted
)source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
is_sorted
)source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
is_sorted
)