use crate::cleaners::cleaned_item::{CleanerFn, CleaningResult};
use crate::cleaners::{system_cleaners, user_cleaners};
#[derive(Debug, Clone)]
pub enum Status {
Pending,
Running,
Success(String),
Error(String),
}
impl Status {
pub fn get_animation_frame(&self, frame: usize) -> &'static str {
match self {
Status::Running => {
const SPINNER: &[&str] = &["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
SPINNER[frame % SPINNER.len()]
}
Status::Success(_) => "✓",
Status::Error(_) => "✗",
Status::Pending => "•",
}
}
}
pub struct CleanerItem {
pub name: String,
pub description: String,
pub requires_root: bool,
pub selected: bool,
pub function: CleanerFn,
pub bytes_cleaned: u64,
pub last_result: Option<CleaningResult>,
pub status: Option<Status>,
}
pub struct CleanerCategory {
pub name: String,
pub description: String,
pub items: Vec<CleanerItem>,
}
pub fn load_categories() -> Vec<CleanerCategory> {
let mut user_items = Vec::new();
for cleaner in user_cleaners::get_cleaners() {
user_items.push(CleanerItem {
name: cleaner.name.to_string(),
description: cleaner.description.to_string(),
requires_root: false,
selected: false,
function: cleaner.function,
bytes_cleaned: 0,
last_result: None,
status: None,
});
}
let mut system_items = Vec::new();
for cleaner in system_cleaners::get_cleaners() {
system_items.push(CleanerItem {
name: cleaner.name.to_string(),
description: cleaner.description.to_string(),
requires_root: cleaner.requires_root,
selected: false,
function: cleaner.function,
bytes_cleaned: 0,
last_result: None,
status: None,
});
}
vec![
CleanerCategory {
name: "User Land Cleaners".to_string(),
description: "Clean user-specific files and caches".to_string(),
items: user_items,
},
CleanerCategory {
name: "System Cleaners".to_string(),
description: "Clean system files and caches (requires root)".to_string(),
items: system_items,
},
]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn load_categories_has_user_and_system() {
let categories = load_categories();
assert_eq!(categories.len(), 2);
assert_eq!(categories[0].name, "User Land Cleaners");
assert_eq!(categories[1].name, "System Cleaners");
assert!(!categories[0].items.is_empty());
assert!(!categories[1].items.is_empty());
assert!(categories[0].items.iter().all(|i| !i.requires_root));
}
#[test]
fn status_animation_frames() {
assert_eq!(Status::Pending.get_animation_frame(0), "•");
assert_eq!(Status::Success("ok".into()).get_animation_frame(0), "✓");
assert_eq!(Status::Error("bad".into()).get_animation_frame(0), "✗");
let running = Status::Running;
assert_eq!(running.get_animation_frame(0), "⠋");
assert_eq!(running.get_animation_frame(1), "⠙");
}
}