#![forbid(unsafe_code, rust_2018_idioms)]
#![deny(missing_debug_implementations, nonstandard_style)]
#![warn(missing_docs, future_incompatible, unreachable_pub)]
use std::fs::{self, DirEntry, ReadDir};
use std::io;
use std::path::Path;
pub fn read_dir_all<P: AsRef<Path>>(path: P) -> io::Result<ReadDirAll> {
let reader = fs::read_dir(path)?;
Ok(ReadDirAll {
readers: vec![reader],
})
}
#[derive(Debug)]
pub struct ReadDirAll {
readers: Vec<ReadDir>,
}
impl ReadDirAll {
fn visit_dir(&mut self, entry: DirEntry) -> Result<DirEntry, io::Error> {
let reader = fs::read_dir(entry.path())?;
self.readers.push(reader);
Ok(entry)
}
}
impl Iterator for ReadDirAll {
type Item = io::Result<DirEntry>;
fn next(&mut self) -> Option<Self::Item> {
loop {
let reader = self.readers.last_mut()?;
match reader.next() {
None => self.readers.pop(),
Some(Ok(entry)) if entry.path().is_dir() => return Some(self.visit_dir(entry)),
result => return result,
};
}
}
}