Skip to main content

spacecrab_core/
path_scanner.rs

1use std::{
2    fs, io, path::{Path, PathBuf}
3};
4
5pub trait Scanner {
6    fn scan(&self, dir: &Path) -> io::Result<Vec<PathBuf>>;
7}
8
9pub struct FilesScanner;
10
11impl Scanner for FilesScanner {
12    fn scan(&self, dir: &Path) -> io::Result<Vec<PathBuf>> {
13        let mut entries = Vec::new();
14        for entry in fs::read_dir(dir)? {
15            let entry = entry?;
16            let path = entry.path();
17            if path.is_dir() {
18                entries.extend(self.scan(&path)?);
19            } else {
20                entries.push(path);
21            }
22        }
23        Ok(entries)
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    use std::{fs, io};
31    use std::io::Write;
32    use std::path::PathBuf;
33    use tempfile::tempdir;
34    
35    #[test]
36    fn test_scan_files() -> io::Result<()> {
37        let tmp = tempdir()?;
38        let dir = tmp.path();
39
40        fs::File::create(dir.join("foo.txt"))?
41            .write_all(b"hello")?;
42        fs::create_dir_all(dir.join("sub/deeper"))?;
43        fs::File::create(dir.join("sub/bar.log"))?
44            .write_all(b"world")?;
45        fs::File::create(dir.join("sub/deeper/baz.md"))?
46            .write_all(b"!")?;
47
48        let scaner = FilesScanner;
49        let mut files = scaner.scan(dir)?;
50        files.sort();
51
52        let expected: Vec<PathBuf> = vec![
53            dir.join("foo.txt"),
54            dir.join("sub/bar.log"),
55            dir.join("sub/deeper/baz.md"),
56        ];
57
58        assert_eq!(files, expected);
59        Ok(())
60    }
61}