//! Workspace directory statistics command use serde::Serialize; use std::path::Path; #[derive(Serialize)] pub struct DirStats { pub file_count: u64, pub total_size: u64, } /// Count files and total size in a directory (non-recursive, top-level only) // @reserved: workspace statistics #[tauri::command] pub async fn workspace_dir_stats(path: String) -> Result { let dir = Path::new(&path); // Canonicalize to resolve '..' components and symlinks let canonical = dir.canonicalize().unwrap_or_else(|_| dir.to_path_buf()); if !canonical.exists() { return Ok(DirStats { file_count: 0, total_size: 0, }); } if !canonical.is_dir() { return Err(format!("{} is not a directory", path)); } let mut file_count: u64 = 0; let mut total_size: u64 = 0; let entries = std::fs::read_dir(&canonical).map_err(|e| format!("Failed to read dir: {}", e))?; for entry in entries.flatten() { if let Ok(metadata) = entry.metadata() { if metadata.is_file() { file_count += 1; total_size += metadata.len(); } } } Ok(DirStats { file_count, total_size, }) }