pub mod hash;
pub mod walker;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use std::time::SystemTime;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FsNode {
pub path: PathBuf,
pub is_dir: bool,
pub size: u64,
pub apparent_size: u64,
pub inode: u64,
pub nlink: u64,
pub modified: Option<SystemTime>,
pub accessed: Option<SystemTime>,
pub children: Vec<FsNode>,
}
impl FsNode {
pub fn leaf(path: PathBuf, size: u64, apparent_size: u64, inode: u64, nlink: u64,
modified: Option<SystemTime>, accessed: Option<SystemTime>) -> Self {
Self { path, is_dir: false, size, apparent_size, inode, nlink, modified, accessed, children: Vec::new() }
}
pub fn flatten_files<'a>(&'a self, out: &mut Vec<&'a FsNode>) {
if self.is_dir {
for c in &self.children { c.flatten_files(out); }
} else {
out.push(self);
}
}
pub fn sort_by_size_desc(&mut self) {
self.children.sort_by(|a, b| b.size.cmp(&a.size));
for c in &mut self.children {
if c.is_dir { c.sort_by_size_desc(); }
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScanResult {
pub root: FsNode,
pub total_size: u64,
pub file_count: u64,
pub dir_count: u64,
pub scan_duration_ms: u128,
}