Skip to main content

file_organizer/models/
save_state.rs

1use crate::utils::{ensure_save_dir, generate_save_filename, get_save_dir};
2use serde::{Deserialize, Serialize};
3use std::path::PathBuf;
4use std::{fs, io};
5
6#[derive(Serialize, Deserialize)]
7pub struct ProcessedFile {
8    pub path: PathBuf,
9    pub name: String,
10    pub size: u64,
11    pub modified: std::time::SystemTime,
12}
13
14#[derive(Serialize, Deserialize)]
15pub struct SaveState {
16    pub input_path: PathBuf,
17    pub output_path: PathBuf,
18    pub processed_files: Vec<ProcessedFile>,
19}
20
21impl SaveState {
22    pub fn new(input_path: PathBuf, output_path: PathBuf) -> Self {
23        Self {
24            input_path,
25            output_path,
26            processed_files: Vec::new(),
27        }
28    }
29
30    pub fn add_processed_file(
31        &mut self,
32        path: PathBuf,
33        name: String,
34        size: u64,
35        modified: std::time::SystemTime,
36    ) {
37        self.processed_files.push(ProcessedFile {
38            path,
39            name,
40            size,
41            modified,
42        });
43    }
44
45    pub fn save(&self) -> io::Result<PathBuf> {
46        ensure_save_dir()?;
47
48        let save_dir = get_save_dir();
49        let filename = generate_save_filename(&self.input_path);
50        let save_path = save_dir.join(filename);
51
52        let json = serde_json::to_string_pretty(self)?;
53        fs::write(&save_path, json)?;
54
55        Ok(save_path)
56    }
57
58    pub fn load(save_path: &PathBuf) -> io::Result<Self> {
59        let content = fs::read_to_string(save_path)?;
60        serde_json::from_str(&content).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
61    }
62
63    pub fn list_saves() -> io::Result<Vec<PathBuf>> {
64        let save_dir = get_save_dir();
65        let entries = fs::read_dir(save_dir)?;
66
67        Ok(entries
68            .filter_map(|entry| entry.ok())
69            .map(|entry| entry.path())
70            .filter(|path| path.extension().and_then(|ext| ext.to_str()) == Some("forg"))
71            .collect())
72    }
73}