From ebd3caae78071a90b42f3b0d2bc98157d023bf9c Mon Sep 17 00:00:00 2001 From: "heesk0223@gmail.com" Date: Fri, 19 Jun 2026 15:46:38 +0900 Subject: [PATCH 1/2] Introduce Core API Layer --- apps/dustfril-cli/src/commands/analyze.rs | 20 +++++++--------- apps/dustfril-cli/src/commands/clean.rs | 23 ++++++------------- apps/dustfril-cli/src/commands/scan.rs | 8 ++----- crates/dustfril-core/src/analyzer/mod.rs | 2 -- crates/dustfril-core/src/analyzer/tests.rs | 13 +++++------ crates/dustfril-core/src/api/analyze.rs | 5 ++++ crates/dustfril-core/src/api/clean.rs | 13 +++++++++++ crates/dustfril-core/src/api/mod.rs | 7 ++++++ crates/dustfril-core/src/api/scan.rs | 11 +++++++++ crates/dustfril-core/src/detector/mod.rs | 2 +- crates/dustfril-core/src/format/date.rs | 12 ++++++++++ crates/dustfril-core/src/format/mod.rs | 5 ++++ .../{analyzer/format.rs => format/size.rs} | 13 ----------- crates/dustfril-core/src/lib.rs | 9 +++++--- 14 files changed, 83 insertions(+), 60 deletions(-) create mode 100644 crates/dustfril-core/src/api/analyze.rs create mode 100644 crates/dustfril-core/src/api/clean.rs create mode 100644 crates/dustfril-core/src/api/mod.rs create mode 100644 crates/dustfril-core/src/api/scan.rs create mode 100644 crates/dustfril-core/src/format/date.rs create mode 100644 crates/dustfril-core/src/format/mod.rs rename crates/dustfril-core/src/{analyzer/format.rs => format/size.rs} (61%) diff --git a/apps/dustfril-cli/src/commands/analyze.rs b/apps/dustfril-cli/src/commands/analyze.rs index 52b3f52..e035aec 100644 --- a/apps/dustfril-cli/src/commands/analyze.rs +++ b/apps/dustfril-cli/src/commands/analyze.rs @@ -1,5 +1,5 @@ use dustfril_core::models::{AnalysisResult, CleanupRecommendation}; -use dustfril_core::{analyzer, detector}; +use dustfril_core::{api, format}; use crate::cli::PathArgs; use crate::shared::path::{resolve_path, validate_path}; @@ -37,19 +37,19 @@ fn print_summary(analysis: &AnalysisResult) { println!( "Total Size: {}\n", - analyzer::format_size(analysis.total_size_bytes) + format::format_size(analysis.total_size_bytes) ); println!("Keep: {}", keep); println!( "Review: {}, Size: {}", review, - analyzer::format_size(review_size) + format::format_size(review_size) ); println!( "Safe To Clean: {}, Size: {}", safe_to_clean, - analyzer::format_size(safe_size) + format::format_size(safe_size) ); println!("\n----------------------------------------\n"); @@ -62,13 +62,9 @@ pub fn execute(args: PathArgs) { return; } - let scan_result = if args.global { - detector::scan_global() - } else { - detector::scan_workspace(&path) - }; + let scan_result = api::scan(&path, args.global); - let analysis_result = analyzer::analyze(scan_result); + let analysis_result = api::analyze(scan_result); if analysis_result.artifacts.is_empty() { println!("No Rust artifacts found."); @@ -82,11 +78,11 @@ pub fn execute(args: PathArgs) { println!(" Path: {}", artifact.artifact.path.display()); - println!(" Size: {}", analyzer::format_size(artifact.size_bytes)); + println!(" Size: {}", format::format_size(artifact.size_bytes)); println!( " Modified: {}", - analyzer::format_modified(artifact.last_modified) + format::format_modified(artifact.last_modified) ); let age_display = artifact diff --git a/apps/dustfril-cli/src/commands/clean.rs b/apps/dustfril-cli/src/commands/clean.rs index 61de217..7a51214 100644 --- a/apps/dustfril-cli/src/commands/clean.rs +++ b/apps/dustfril-cli/src/commands/clean.rs @@ -1,5 +1,5 @@ use dustfril_core::{ - analyzer, cleaner, detector, + api, format, models::{CleanupPlan, CleanupResult}, }; @@ -25,15 +25,9 @@ use std::io::{self, Write}; fn build_cleanup_plan(args: &CleanArgs) -> CleanupPlan { let path = resolve_path(&args.path_args.path); - let scan_result = if args.path_args.global { - detector::scan_global() - } else { - detector::scan_workspace(&path) - }; + let scan_result = api::scan(&path, args.path_args.global); - let analysis = analyzer::analyze(scan_result); - - cleaner::create_cleanup_plan(analysis) + api::clean::build_plan(scan_result) } fn confirm_cleanup() -> bool { @@ -59,15 +53,12 @@ fn print_cleanup_plan(plan: &CleanupPlan) { println!(" Path: {}", candidate.path.display()); - println!(" Size: {}\n", analyzer::format_size(candidate.size_bytes)); + println!(" Size: {}\n", format::format_size(candidate.size_bytes)); } println!("Total Reclaimable Space\n"); - println!( - " {}\n", - analyzer::format_size(plan.reclaimable_size_bytes()) - ); + println!(" {}\n", format::format_size(plan.reclaimable_size_bytes())); } fn print_cleanup_result(result: &CleanupResult) { @@ -77,7 +68,7 @@ fn print_cleanup_result(result: &CleanupResult) { println!("Failed: {}", result.failed_paths.len()); - println!("Freed: {}", analyzer::format_size(result.freed_size_bytes)); + println!("Freed: {}", format::format_size(result.freed_size_bytes)); if !result.deleted_paths.is_empty() { println!("Deleted\n"); @@ -105,7 +96,7 @@ pub fn execute(args: &CleanArgs) { return; } - let result = cleaner::execute_cleanup(&plan); + let result = api::clean::execute(&plan); print_cleanup_result(&result); } diff --git a/apps/dustfril-cli/src/commands/scan.rs b/apps/dustfril-cli/src/commands/scan.rs index 515f845..fca9ca0 100644 --- a/apps/dustfril-cli/src/commands/scan.rs +++ b/apps/dustfril-cli/src/commands/scan.rs @@ -1,4 +1,4 @@ -use dustfril_core::detector; +use dustfril_core::api; use crate::{ cli::PathArgs, @@ -12,11 +12,7 @@ pub fn execute(args: PathArgs) { return; } - let result = if args.global { - detector::scan_global() - } else { - detector::scan_workspace(&path) - }; + let result = api::scan(&path, args.global); if result.artifacts.is_empty() { println!("No Rust artifacts found."); diff --git a/crates/dustfril-core/src/analyzer/mod.rs b/crates/dustfril-core/src/analyzer/mod.rs index 6b88675..198e79b 100644 --- a/crates/dustfril-core/src/analyzer/mod.rs +++ b/crates/dustfril-core/src/analyzer/mod.rs @@ -1,7 +1,6 @@ //! Analyzer module. mod age; mod analyze; -mod format; mod metadata; mod recommendation; mod size; @@ -11,7 +10,6 @@ mod tests; pub use age::calculate_age_days; pub use analyze::analyze; -pub use format::{format_modified, format_size}; pub use metadata::find_latest_modified; pub use recommendation::recommend_cleanup; pub use size::calculate_directory_size; diff --git a/crates/dustfril-core/src/analyzer/tests.rs b/crates/dustfril-core/src/analyzer/tests.rs index d71fa6d..14e329f 100644 --- a/crates/dustfril-core/src/analyzer/tests.rs +++ b/crates/dustfril-core/src/analyzer/tests.rs @@ -1,9 +1,8 @@ use std::fs; use tempfile::TempDir; -use crate::analyzer::{ - calculate_age_days, calculate_directory_size, find_latest_modified, format_size, -}; +use crate::analyzer::{calculate_age_days, calculate_directory_size, find_latest_modified}; +use crate::format::size; use crate::{ analyzer::analyze, models::{ArtifactLocation, ArtifactType, ScanResult}, @@ -64,22 +63,22 @@ fn find_latest_modified_returns_some() { #[test] fn format_size_bytes() { - assert_eq!(format_size(512), "512 B"); + assert_eq!(size::format_size(512), "512 B"); } #[test] fn format_size_kilobytes() { - assert_eq!(format_size(2048), "2.00 KB"); + assert_eq!(size::format_size(2048), "2.00 KB"); } #[test] fn format_size_megabytes() { - assert_eq!(format_size(1024 * 1024), "1.00 MB"); + assert_eq!(size::format_size(1024 * 1024), "1.00 MB"); } #[test] fn format_size_gigabytes() { - assert_eq!(format_size(1024 * 1024 * 1024), "1.00 GB"); + assert_eq!(size::format_size(1024 * 1024 * 1024), "1.00 GB"); } #[test] diff --git a/crates/dustfril-core/src/api/analyze.rs b/crates/dustfril-core/src/api/analyze.rs new file mode 100644 index 0000000..34c25c4 --- /dev/null +++ b/crates/dustfril-core/src/api/analyze.rs @@ -0,0 +1,5 @@ +use crate::{analyzer, models::ScanResult}; + +pub fn analyze(scan_result: ScanResult) -> crate::models::AnalysisResult { + analyzer::analyze(scan_result) +} diff --git a/crates/dustfril-core/src/api/clean.rs b/crates/dustfril-core/src/api/clean.rs new file mode 100644 index 0000000..430cb87 --- /dev/null +++ b/crates/dustfril-core/src/api/clean.rs @@ -0,0 +1,13 @@ +use crate::{ + analyzer, cleaner, + models::{CleanupPlan, CleanupResult, ScanResult}, +}; + +pub fn build_plan(scan: ScanResult) -> CleanupPlan { + let analysis = analyzer::analyze(scan); + cleaner::create_cleanup_plan(analysis) +} + +pub fn execute(plan: &CleanupPlan) -> CleanupResult { + cleaner::execute_cleanup(plan) +} diff --git a/crates/dustfril-core/src/api/mod.rs b/crates/dustfril-core/src/api/mod.rs new file mode 100644 index 0000000..ba04d0b --- /dev/null +++ b/crates/dustfril-core/src/api/mod.rs @@ -0,0 +1,7 @@ +pub mod analyze; +pub mod clean; +pub mod scan; + +pub use analyze::*; +pub use clean::*; +pub use scan::*; diff --git a/crates/dustfril-core/src/api/scan.rs b/crates/dustfril-core/src/api/scan.rs new file mode 100644 index 0000000..49a52d8 --- /dev/null +++ b/crates/dustfril-core/src/api/scan.rs @@ -0,0 +1,11 @@ +use std::path::Path; + +use crate::detector; + +pub fn scan(root: &Path, global: bool) -> crate::models::ScanResult { + if global { + detector::scan_global() + } else { + detector::scan_workspace(root) + } +} diff --git a/crates/dustfril-core/src/detector/mod.rs b/crates/dustfril-core/src/detector/mod.rs index c319305..9beb060 100644 --- a/crates/dustfril-core/src/detector/mod.rs +++ b/crates/dustfril-core/src/detector/mod.rs @@ -5,4 +5,4 @@ mod scan; #[cfg(test)] mod tests; -pub use scan::{scan, scan_global, scan_project, scan_workspace}; +pub use scan::*; diff --git a/crates/dustfril-core/src/format/date.rs b/crates/dustfril-core/src/format/date.rs new file mode 100644 index 0000000..0288b01 --- /dev/null +++ b/crates/dustfril-core/src/format/date.rs @@ -0,0 +1,12 @@ +use chrono::{DateTime, Local}; +use std::time::SystemTime; + +pub fn format_modified(modified: Option) -> String { + let Some(modified) = modified else { + return "Unknown".to_string(); + }; + + let datetime: DateTime = modified.into(); + + datetime.format("%Y-%m-%d %H:%M:%S").to_string() +} diff --git a/crates/dustfril-core/src/format/mod.rs b/crates/dustfril-core/src/format/mod.rs new file mode 100644 index 0000000..ee3a7d4 --- /dev/null +++ b/crates/dustfril-core/src/format/mod.rs @@ -0,0 +1,5 @@ +pub mod date; +pub mod size; + +pub use date::*; +pub use size::*; diff --git a/crates/dustfril-core/src/analyzer/format.rs b/crates/dustfril-core/src/format/size.rs similarity index 61% rename from crates/dustfril-core/src/analyzer/format.rs rename to crates/dustfril-core/src/format/size.rs index ba40a73..06b65d3 100644 --- a/crates/dustfril-core/src/analyzer/format.rs +++ b/crates/dustfril-core/src/format/size.rs @@ -18,16 +18,3 @@ pub fn format_size(bytes: u64) -> String { format!("{:.0} B", bytes) } } - -use chrono::{DateTime, Local}; -use std::time::SystemTime; - -pub fn format_modified(modified: Option) -> String { - let Some(modified) = modified else { - return "Unknown".to_string(); - }; - - let datetime: DateTime = modified.into(); - - datetime.format("%Y-%m-%d %H:%M:%S").to_string() -} diff --git a/crates/dustfril-core/src/lib.rs b/crates/dustfril-core/src/lib.rs index fb21a2b..1171c4c 100644 --- a/crates/dustfril-core/src/lib.rs +++ b/crates/dustfril-core/src/lib.rs @@ -1,4 +1,7 @@ -pub mod analyzer; -pub mod cleaner; -pub mod detector; +pub mod api; +pub mod format; pub mod models; + +mod analyzer; +mod cleaner; +mod detector; From c149e26c5a639e21a6b9d15dd99ddab77d0c93fb Mon Sep 17 00:00:00 2001 From: "heesk0223@gmail.com" Date: Fri, 19 Jun 2026 15:52:40 +0900 Subject: [PATCH 2/2] Update PR template --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++---- crates/dustfril-core/src/detector/scan.rs | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 045cf44..75cd195 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -12,10 +12,10 @@ Closes # ### Required -- [ ] cargo check passes -- [ ] cargo fmt --check passes -- [ ] cargo clippy --workspace --all-targets -- -D warnings passes -- [ ] cargo test passes +- [ ] `cargo check` passes +- [ ] `cargo fmt --check` passes +- [ ] `cargo clippy --workspace --all-targets -- -D warnings` passes +- [ ] `cargo test` passes ### Functional Validation diff --git a/crates/dustfril-core/src/detector/scan.rs b/crates/dustfril-core/src/detector/scan.rs index ed36737..f7090be 100644 --- a/crates/dustfril-core/src/detector/scan.rs +++ b/crates/dustfril-core/src/detector/scan.rs @@ -52,10 +52,10 @@ pub fn scan_global() -> ScanResult { result } -pub fn scan(root: &Path) -> ScanResult { - let mut result = scan_workspace(root); +// pub fn scan(root: &Path) -> ScanResult { +// let mut result = scan_workspace(root); - result.artifacts.extend(scan_global().artifacts); +// result.artifacts.extend(scan_global().artifacts); - result -} +// result +// }