git/grrs/main

refactor: separate file locations

separated config, data, and cache paths according to XDG standards. this closes e343905
diff --git a/src/app.rs b/src/app.rs
index d8fb821..4d36202 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -62,10 +62,43 @@ pub struct AppState {
impl AppState {
pub fn new() -> Self {
- let config_dir = PathBuf::from(env::var("HOME").unwrap_or_default()).join(".config/grrs");
+ let home = env::var("HOME").unwrap_or_default();
+
+ let config_dir = env::var("XDG_CONFIG_HOME")
+ .map(PathBuf::from)
+ .unwrap_or_else(|_| PathBuf::from(&home).join(".config"))
+ .join("grrs");
+
+ let data_dir = env::var("XDG_DATA_HOME")
+ .map(PathBuf::from)
+ .unwrap_or_else(|_| PathBuf::from(&home).join(".local/share"))
+ .join("grrs");
+
+ let cache_dir = env::var("XDG_CACHE_HOME")
+ .map(PathBuf::from)
+ .unwrap_or_else(|_| PathBuf::from(&home).join(".cache"))
+ .join("grrs");
+
fs::create_dir_all(&config_dir).ok();
- let likes_file = config_dir.join("likes.json");
+ fs::create_dir_all(&data_dir).ok();
+ fs::create_dir_all(&cache_dir).ok();
+
+ let old_likes = config_dir.join("likes.json");
+ let new_likes = data_dir.join("likes.json");
+ let old_art = config_dir.join("art");
+ let new_art = data_dir.join("art");
+ if old_likes.exists() && !new_likes.exists() {
+ let _ = fs::rename(&old_likes, &new_likes);
+ }
+ if old_art.exists() && !new_art.exists() {
+ let _ = fs::rename(&old_art, &new_art);
+ }
+
+ // clean up the orphaned current_art.jpg from the old config dir
+ let _ = fs::remove_file(config_dir.join("current_art.jpg"));
+
+ let likes_file = new_likes;
let likes = fs::read_to_string(&likes_file)
.ok()
.and_then(|d| serde_json::from_str(&d).ok())
@@ -77,13 +110,7 @@ impl AppState {
Color::Gray, Color::White,
];
- let cache_dir = env::var("XDG_CACHE_HOME")
- .map(PathBuf::from)
- .unwrap_or_else(|_| PathBuf::from(env::var("HOME").unwrap_or_default()).join(".cache"))
- .join("grrs");
- fs::create_dir_all(&cache_dir).ok();
let theme_file = cache_dir.join("theme.txt");
-
let mut theme_color = SEAFOAM;
let mut color_idx = 0;
@@ -151,7 +178,7 @@ impl AppState {
let mut v: Vec<_> = self.likes.values().cloned().collect();
v.sort_by(|a, b| b.timestamp.cmp(&a.timestamp));
v
- }
+ }
pub fn cycle_theme(&mut self) {
self.color_idx = (self.color_idx + 1) % self.available_colors.len();