spacecrab_core/
path_scanner.rs1use 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}