1pub mod hash;
2pub mod walker;
3use serde::{Deserialize, Serialize};
4use std::path::PathBuf;
5use std::time::SystemTime;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct FsNode {
9 pub path: PathBuf,
10 pub is_dir: bool,
11 pub size: u64,
12 pub apparent_size: u64,
13 pub inode: u64,
14 pub nlink: u64,
15 pub modified: Option<SystemTime>,
16 pub accessed: Option<SystemTime>,
17 pub children: Vec<FsNode>,
18}
19
20impl FsNode {
21 pub fn leaf(path: PathBuf, size: u64, apparent_size: u64, inode: u64, nlink: u64,
22 modified: Option<SystemTime>, accessed: Option<SystemTime>) -> Self {
23 Self { path, is_dir: false, size, apparent_size, inode, nlink, modified, accessed, children: Vec::new() }
24 }
25 pub fn flatten_files<'a>(&'a self, out: &mut Vec<&'a FsNode>) {
26 if self.is_dir {
27 for c in &self.children { c.flatten_files(out); }
28 } else {
29 out.push(self);
30 }
31 }
32 pub fn sort_by_size_desc(&mut self) {
33 self.children.sort_by(|a, b| b.size.cmp(&a.size));
34 for c in &mut self.children {
35 if c.is_dir { c.sort_by_size_desc(); }
36 }
37 }
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct ScanResult {
42 pub root: FsNode,
43 pub total_size: u64,
44 pub file_count: u64,
45 pub dir_count: u64,
46 pub scan_duration_ms: u128,
47}