file_organizer/models/
save_state.rs1use 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}