-
Notifications
You must be signed in to change notification settings - Fork 0
/
entry_to_path.rs
36 lines (30 loc) · 1.3 KB
/
entry_to_path.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//! Export the `struct` [`EntryToPath`]. Maps an iterator over items of
//! type [DirEntry] or `Result<DirEntry>` into one over items of type
//! [PathBuf] and `Result<PathBuf>` respectively.
use std::{fs::DirEntry, io::Result, path::PathBuf};
/// Maps an iterator over items of type [DirEntry] or `Result<DirEntry>` into one
/// over items of type [PathBuf] and `Result<PathBuf>` respectively.
pub struct EntryToPath<T, I: Iterator<Item = T>>(pub I);
/// The implementation for [DirEntry] items must yield items of type [PathBuf]
impl<I: Iterator<Item = DirEntry>> Iterator for EntryToPath<DirEntry, I> {
type Item = PathBuf;
fn next(&mut self) -> Option<Self::Item> {
match self.0.next() {
Some(e) => Some(e.path()),
None => None,
}
}
}
/// The implementation for `Result<DirEntry>` items must yield items of type `Result<PathBuf>`.
///
/// In this implementation any [Err] variant coming out of the original iterator are left "as is".
impl<I: Iterator<Item = Result<DirEntry>>> Iterator for EntryToPath<Result<DirEntry>, I> {
type Item = Result<PathBuf>;
fn next(&mut self) -> Option<Self::Item> {
match self.0.next() {
Some(Ok(e)) => Some(Ok(e.path())),
Some(Err(e)) => Some(Err(e)),
None => None,
}
}
}