From efc34c89095a36bfcbd04d3cfc93b98c81d0e3bf Mon Sep 17 00:00:00 2001 From: Damien Date: Sat, 22 Feb 2025 08:36:09 -0500 Subject: [PATCH] new crawler module --- src-tauri/src/folder_crawler/mod.rs | 55 +++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src-tauri/src/folder_crawler/mod.rs diff --git a/src-tauri/src/folder_crawler/mod.rs b/src-tauri/src/folder_crawler/mod.rs new file mode 100644 index 0000000..4996fc3 --- /dev/null +++ b/src-tauri/src/folder_crawler/mod.rs @@ -0,0 +1,55 @@ +use std::fs; +use std::path::PathBuf; +use serde::Serialize; + +#[derive(Serialize, Debug)] +struct FolderData { + name: String, + path: String, + #[serde(rename = "type")] + folder_type: String, // Always "folder" in this case + size: u64, + subfolders: usize, +} + +pub struct FolderCrawler { + stack: Vec, +} + +impl FolderCrawler { + pub fn new(root: PathBuf) -> Self { + Self { stack: vec![root] } + } +} + +pub impl Iterator for FolderCrawler { + type Item = FolderData; + + fn next(&mut self) -> Option { + while let Some(path) = self.stack.pop() { + if let Ok(entries) = fs::read_dir(&path) { + let mut size = 0; + let mut subfolder_count = 0; + + for entry in entries.flatten() { + let entry_path = entry.path(); + if entry_path.is_dir() { + subfolder_count += 1; + self.stack.push(entry_path); + } else { + size += entry.metadata().unwrap().len(); + } + } + + return Some(FolderData { + name: path.file_name().unwrap().to_str().unwrap().to_string(), + path: path.to_str().unwrap().to_string(), + folder_type: "folder".to_string(), + size, + subfolders: subfolder_count, + }); + } + } + None + } +} \ No newline at end of file