pub struct ReadDirIter(/* private fields */);Expand description
Iterator over directory entries.
Wraps a boxed iterator for flexibility across different backends.
- Outer
Result(fromFsDir::read_dir) = “can I open this directory?” - Inner
Result(per item) = “can I read this entry?”
§Example
use anyfs_backend::{Fs, FsError};
use std::path::Path;
// Generic function that works with any Fs implementation
fn list_files<B: Fs>(backend: &B) -> Result<Vec<String>, FsError> {
let mut names = Vec::new();
for entry in backend.read_dir(Path::new("/"))? {
let entry = entry?;
names.push(entry.name);
}
Ok(names)
}Implementations§
Source§impl ReadDirIter
impl ReadDirIter
Sourcepub fn from_vec(entries: Vec<Result<DirEntry, FsError>>) -> Self
pub fn from_vec(entries: Vec<Result<DirEntry, FsError>>) -> Self
Create from a pre-collected vector.
Useful for middleware like Overlay that merges multiple directory listings.
Examples found in repository?
examples/generic_functions.rs (line 449)
416 fn read_dir(&self, path: &Path) -> Result<ReadDirIter, FsError> {
417 if !self.dirs.read().unwrap().contains(path) {
418 return Err(FsError::NotFound {
419 path: path.to_path_buf(),
420 });
421 }
422 let mut entries = Vec::new();
423 for (fp, data) in self.files.read().unwrap().iter() {
424 if fp.parent() == Some(path) {
425 if let Some(name) = fp.file_name() {
426 entries.push(Ok(DirEntry {
427 name: name.to_string_lossy().into(),
428 path: fp.clone(),
429 file_type: FileType::File,
430 size: data.len() as u64,
431 inode: 0,
432 }));
433 }
434 }
435 }
436 for dp in self.dirs.read().unwrap().iter() {
437 if dp.parent() == Some(path) && dp != path {
438 if let Some(name) = dp.file_name() {
439 entries.push(Ok(DirEntry {
440 name: name.to_string_lossy().into(),
441 path: dp.clone(),
442 file_type: FileType::Directory,
443 size: 0,
444 inode: 0,
445 }));
446 }
447 }
448 }
449 Ok(ReadDirIter::from_vec(entries))
450 }More examples
examples/layer_middleware.rs (line 606)
573 fn read_dir(&self, path: &Path) -> Result<ReadDirIter, FsError> {
574 if !self.dirs.read().unwrap().contains(path) {
575 return Err(FsError::NotFound {
576 path: path.to_path_buf(),
577 });
578 }
579 let mut entries = Vec::new();
580 for (fp, data) in self.files.read().unwrap().iter() {
581 if fp.parent() == Some(path) {
582 if let Some(name) = fp.file_name() {
583 entries.push(Ok(DirEntry {
584 name: name.to_string_lossy().into(),
585 path: fp.clone(),
586 file_type: FileType::File,
587 size: data.len() as u64,
588 inode: 0,
589 }));
590 }
591 }
592 }
593 for dp in self.dirs.read().unwrap().iter() {
594 if dp.parent() == Some(path) && dp != path {
595 if let Some(name) = dp.file_name() {
596 entries.push(Ok(DirEntry {
597 name: name.to_string_lossy().into(),
598 path: dp.clone(),
599 file_type: FileType::Directory,
600 size: 0,
601 inode: 0,
602 }));
603 }
604 }
605 }
606 Ok(ReadDirIter::from_vec(entries))
607 }examples/basic_usage.rs (line 216)
173 fn read_dir(&self, path: &Path) -> Result<ReadDirIter, FsError> {
174 if !self.dirs.read().unwrap().contains(path) {
175 return Err(FsError::NotFound {
176 path: path.to_path_buf(),
177 });
178 }
179
180 let mut entries = Vec::new();
181
182 // Collect files in this directory
183 for (file_path, data) in self.files.read().unwrap().iter() {
184 if let Some(parent) = file_path.parent() {
185 if parent == path {
186 if let Some(name) = file_path.file_name() {
187 entries.push(Ok(DirEntry {
188 name: name.to_string_lossy().into_owned(),
189 path: file_path.clone(),
190 file_type: FileType::File,
191 size: data.len() as u64,
192 inode: 0,
193 }));
194 }
195 }
196 }
197 }
198
199 // Collect subdirectories
200 for dir_path in self.dirs.read().unwrap().iter() {
201 if let Some(parent) = dir_path.parent() {
202 if parent == path && dir_path != path {
203 if let Some(name) = dir_path.file_name() {
204 entries.push(Ok(DirEntry {
205 name: name.to_string_lossy().into_owned(),
206 path: dir_path.clone(),
207 file_type: FileType::Directory,
208 size: 0,
209 inode: 0,
210 }));
211 }
212 }
213 }
214 }
215
216 Ok(ReadDirIter::from_vec(entries))
217 }examples/inmemory_fs.rs (line 416)
338 fn read_dir(&self, path: &Path) -> Result<ReadDirIter, FsError> {
339 if !self.dirs.read().unwrap().contains(path) {
340 return Err(FsError::NotFound {
341 path: path.to_path_buf(),
342 });
343 }
344
345 let mut entries = Vec::new();
346
347 // Collect files in this directory
348 for (file_path, data) in self.files.read().unwrap().iter() {
349 if let Some(parent) = file_path.parent() {
350 if parent == path {
351 if let Some(name) = file_path.file_name() {
352 entries.push(Ok(DirEntry {
353 name: name.to_string_lossy().into_owned(),
354 path: file_path.clone(),
355 file_type: FileType::File,
356 size: data.len() as u64,
357 inode: self
358 .inodes
359 .read()
360 .unwrap()
361 .get(file_path)
362 .copied()
363 .unwrap_or(0),
364 }));
365 }
366 }
367 }
368 }
369
370 // Collect subdirectories
371 for dir_path in self.dirs.read().unwrap().iter() {
372 if let Some(parent) = dir_path.parent() {
373 if parent == path && dir_path != path {
374 if let Some(name) = dir_path.file_name() {
375 entries.push(Ok(DirEntry {
376 name: name.to_string_lossy().into_owned(),
377 path: dir_path.clone(),
378 file_type: FileType::Directory,
379 size: 0,
380 inode: self
381 .inodes
382 .read()
383 .unwrap()
384 .get(dir_path)
385 .copied()
386 .unwrap_or(0),
387 }));
388 }
389 }
390 }
391 }
392
393 // Collect symlinks
394 for link_path in self.symlinks.read().unwrap().keys() {
395 if let Some(parent) = link_path.parent() {
396 if parent == path {
397 if let Some(name) = link_path.file_name() {
398 entries.push(Ok(DirEntry {
399 name: name.to_string_lossy().into_owned(),
400 path: link_path.clone(),
401 file_type: FileType::Symlink,
402 size: 0,
403 inode: self
404 .inodes
405 .read()
406 .unwrap()
407 .get(link_path)
408 .copied()
409 .unwrap_or(0),
410 }));
411 }
412 }
413 }
414 }
415
416 Ok(ReadDirIter::from_vec(entries))
417 }Trait Implementations§
Source§impl Iterator for ReadDirIter
impl Iterator for ReadDirIter
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
Advances the iterator and returns the next value. Read more
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,
🔬This is a nightly-only experimental API. (
iter_next_chunk)Advances the iterator and returns an array containing the next
N values. Read more1.0.0 · Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Consumes the iterator, returning the last element. Read more
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
🔬This is a nightly-only experimental API. (
iter_advance_by)Advances the iterator 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>
Returns the
nth 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,
Creates an iterator starting at the same point, but stepping by
the given amount at each iteration. Read more
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>
Takes two iterators and creates a new iterator over both in sequence. Read more
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,
‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
🔬This is a nightly-only experimental API. (
iter_intersperse)Creates a new iterator which places a copy of
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>
🔬This is a nightly-only experimental API. (
iter_intersperse)Creates a new iterator which places an item generated by
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>
Takes a closure and creates an iterator which calls that closure on each
element. Read more
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
Creates an iterator which uses a closure to determine if an element
should be yielded. Read more
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>
Creates an iterator that both filters and maps. Read more
1.0.0 · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
Creates an iterator which gives the current iteration count as well as
the next value. Read more
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>
Creates an iterator that yields elements based on a predicate. Read more
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>
Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
Creates an iterator that skips the first
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,
Creates an iterator that yields the first
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>
Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Creates an iterator that flattens nested structure. Read more
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>
🔬This is a nightly-only experimental API. (
iter_map_windows)Calls the given function
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>
Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Creates a “by reference” adapter for this instance of
Iterator. Read moreSource§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
🔬This is a nightly-only experimental API. (
iterator_try_collect)Fallibly transforms an iterator into a collection, short circuiting if
a failure is encountered. Read more
Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
🔬This is a nightly-only experimental API. (
iter_collect_into)Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Consumes an iterator, creating two collections from it. Read more
Source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
🔬This is a nightly-only experimental API. (
iter_is_partitioned)Checks if the elements of this iterator are partitioned according to the given predicate,
such that all those that return
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
An iterator method that applies a function as long as it returns
successfully, producing a single, final value. Read more
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
An iterator method that applies a fallible function to each item in the
iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
Folds every element into an accumulator by applying an operation,
returning the final result. Read more
1.51.0 · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Reduces the elements to a single one, by repeatedly applying a reducing
operation. Read more
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
🔬This is a nightly-only experimental API. (
iterator_try_reduce)Reduces the elements to a single one by repeatedly applying a reducing operation. If the
closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
Searches for an element of an iterator that satisfies a predicate. Read more
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>
Applies function to the elements of iterator and returns
the first non-none result. Read more
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
🔬This is a nightly-only experimental API. (
try_find)Applies function to the elements of iterator and returns
the first true result or the first error. Read more
1.0.0 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
Returns the maximum element of an iterator. Read more
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
Returns the minimum element of an iterator. Read more
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>
Returns the element that gives the maximum value from the
specified function. Read more
1.15.0 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
Returns the element that gives the maximum value with respect to the
specified comparison function. Read more
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>
Returns the element that gives the minimum value from the
specified function. Read more
1.15.0 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
Returns the element that gives the minimum value with respect to the
specified comparison function. Read more
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
Creates an iterator which copies all of its elements. Read more
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,
🔬This is a nightly-only experimental API. (
iter_array_chunks)Returns an iterator over
N elements of the iterator at a time. Read more1.11.0 · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Iterates over the entire iterator, multiplying all the elements Read more
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
🔬This is a nightly-only experimental API. (
iter_order_by)Lexicographically compares the elements of this
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>
Lexicographically compares the
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>,
🔬This is a nightly-only experimental API. (
iter_order_by)Lexicographically compares the elements of this
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
🔬This is a nightly-only experimental API. (
iter_order_by)1.5.0 · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Determines if the elements of this
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
Determines if the elements of this
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
Determines if the elements of this
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
Determines if the elements of this
Iterator are lexicographically
greater than or equal to those of another. Read more1.82.0 · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
Checks if the elements of this iterator are sorted using the given key extraction
function. Read more
Auto Trait Implementations§
impl Freeze for ReadDirIter
impl !RefUnwindSafe for ReadDirIter
impl Send for ReadDirIter
impl !Sync for ReadDirIter
impl Unpin for ReadDirIter
impl !UnwindSafe for ReadDirIter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more