use std::path::PathBuf;
use sysinfo::System;
struct Browser {
process_match: &'static [&'static str],
caches: Vec<(PathBuf, &'static str)>,
}
fn browsers(home: &std::path::Path) -> Vec<Browser> {
vec![
Browser {
process_match: &["google chrome", "chrome"],
caches: vec![
(home.join("Library/Caches/Google/Chrome"), "Chrome cache"),
(home.join("Library/Application Support/Google/Chrome/Default/Service Worker/CacheStorage"), "Chrome Service Workers"),
(home.join("Library/Application Support/Google/Chrome/Default/Code Cache"), "Chrome Code Cache"),
(home.join(".cache/google-chrome"), "Chrome cache (Linux)"),
],
},
Browser {
process_match: &["safari"],
caches: vec![
(home.join("Library/Caches/com.apple.Safari"), "Safari cache"),
],
},
Browser {
process_match: &["firefox"],
caches: vec![
(home.join("Library/Caches/Firefox"), "Firefox cache"),
(home.join(".cache/mozilla/firefox"), "Firefox cache (Linux)"),
],
},
Browser {
process_match: &["brave"],
caches: vec![
(home.join("Library/Caches/BraveSoftware/Brave-Browser"), "Brave cache"),
(home.join("Library/Application Support/BraveSoftware/Brave-Browser/Default/Service Worker/CacheStorage"), "Brave Service Workers"),
],
},
Browser {
process_match: &["arc"],
caches: vec![
(home.join("Library/Caches/company.thebrowser.Browser"), "Arc cache"),
],
},
Browser {
process_match: &["microsoft edge", "msedge", "edge"],
caches: vec![
(home.join("Library/Caches/Microsoft Edge"), "Edge cache"),
(home.join("Library/Application Support/Microsoft Edge/Default/Service Worker/CacheStorage"), "Edge Service Workers"),
],
},
Browser {
process_match: &["vivaldi"],
caches: vec![
(home.join("Library/Caches/Vivaldi"), "Vivaldi cache"),
],
},
]
}
fn running_process_names() -> Vec<String> {
let mut sys = System::new();
sys.refresh_processes();
sys.processes()
.values()
.map(|p| p.name().to_lowercase())
.collect()
}
fn is_running(process_match: &[&str], running: &[String]) -> bool {
running.iter().any(|name| process_match.iter().any(|m| name.contains(m)))
}
pub fn browser_cache_paths() -> Vec<(PathBuf, &'static str)> {
let home = crate::error::home_or_exit();
let running = running_process_names();
browsers(&home)
.into_iter()
.filter(|b| !is_running(b.process_match, &running))
.flat_map(|b| b.caches.into_iter())
.filter(|(p, _)| p.exists())
.collect()
}