From ecf71d5daef7be88e66f82c075f4438a83c2433a Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Sat, 16 Sep 2023 15:25:30 -0300 Subject: [PATCH] Working with iter --- diritertest/Cargo.lock | 7 ++++++ diritertest/Cargo.toml | 8 +++++++ diritertest/README.md | 3 +++ diritertest/src/diriter.rs | 48 ++++++++++++++++++++++++++++++++++++++ diritertest/src/main.rs | 21 +++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 diritertest/Cargo.lock create mode 100644 diritertest/Cargo.toml create mode 100644 diritertest/README.md create mode 100644 diritertest/src/diriter.rs create mode 100644 diritertest/src/main.rs diff --git a/diritertest/Cargo.lock b/diritertest/Cargo.lock new file mode 100644 index 0000000..84e82c9 --- /dev/null +++ b/diritertest/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "diritertest" +version = "0.1.0" diff --git a/diritertest/Cargo.toml b/diritertest/Cargo.toml new file mode 100644 index 0000000..108236b --- /dev/null +++ b/diritertest/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "diritertest" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/diritertest/README.md b/diritertest/README.md new file mode 100644 index 0000000..414d934 --- /dev/null +++ b/diritertest/README.md @@ -0,0 +1,3 @@ +# DirIterTest + +An iterator over directories (and subdirectories). diff --git a/diritertest/src/diriter.rs b/diritertest/src/diriter.rs new file mode 100644 index 0000000..0944ded --- /dev/null +++ b/diritertest/src/diriter.rs @@ -0,0 +1,48 @@ +//! Iterator over directories + +use std::collections::VecDeque; +use std::fs::DirEntry; +use std::fs::ReadDir; +use std::path::Path; +use std::path::PathBuf; + +pub struct DirIter { + curr_dir: ReadDir, + remaining_dirs: VecDeque, +} + +impl DirIter { + pub fn new(start: &Path) -> std::io::Result { + Ok(Self { + curr_dir: start.read_dir()?, + remaining_dirs: VecDeque::new(), + }) + } + + pub fn advance(&mut self) -> Option { + let next = self.curr_dir.next(); + match next { + Some(Ok(x)) => { + if x.path().is_dir() { + self.remaining_dirs.push_back(x.path()); + self.advance() + } else { + Some(x.path()) + } + } + Some(Err(_)) | None => { + let next_dir = self.remaining_dirs.pop_front()?; + self.curr_dir = std::fs::read_dir(next_dir).ok()?; + self.advance() + } + } + } +} + +impl Iterator for DirIter { + type Item = PathBuf; + + fn next(&mut self) -> Option { + self.advance() + } +} diff --git a/diritertest/src/main.rs b/diritertest/src/main.rs new file mode 100644 index 0000000..8d11a0b --- /dev/null +++ b/diritertest/src/main.rs @@ -0,0 +1,21 @@ +use std::path::Path; + +use crate::diriter::DirIter; + +mod diriter; + +fn main() { + let mut all_iter = DirIter::new(&Path::new(".")).unwrap(); + while let Some(path) = all_iter.next() { + println!(">> {:?}", path); + } + + println!("-----------------------"); + + let all_iter = DirIter::new(&Path::new(".")).unwrap(); + for path in all_iter { + println!(">>> {:?}", path); + } + + println!("Hello, world!"); +}