more_fps/
reusable_temp_dir.rs

1use clap::ValueEnum;
2use std::fs;
3use std::io;
4use std::path::Path;
5use std::path::PathBuf;
6use strum_macros::Display;
7
8#[derive(Debug)]
9pub struct ReusableTempDir {
10    base_dir: PathBuf,
11    ffmpeg_dir: PathBuf,
12    generated_frames_dir: PathBuf,
13}
14
15impl ReusableTempDir {
16    pub fn try_new(base_dir: PathBuf, reset_data: ResetData) -> Result<Self, io::Error> {
17        let ffmpeg_dir = base_dir.join("ffmpeg");
18        let generated_frames_dir = base_dir.join("generated_frames");
19
20        match reset_data {
21            ResetData::Everything => fs::remove_dir_all(&base_dir).unwrap_or_default(),
22            ResetData::Nothing => (),
23        };
24
25        // recreate the folders
26        dir_exists_or_create(&ffmpeg_dir)?;
27        dir_exists_or_create(&generated_frames_dir)?;
28
29        Ok(Self {
30            base_dir,
31            ffmpeg_dir,
32            generated_frames_dir,
33        })
34    }
35
36    pub fn ffmpeg_dir(&self) -> &PathBuf {
37        &self.ffmpeg_dir
38    }
39
40    pub fn generated_frames_dir(&self) -> &PathBuf {
41        &self.generated_frames_dir
42    }
43
44    pub fn delete(self) -> Result<(), io::Error> {
45        fs::remove_dir_all(self.base_dir)?;
46        Ok(())
47    }
48}
49
50fn dir_exists_or_create(path: &Path) -> Result<(), io::Error> {
51    if !path.exists() {
52        fs::create_dir_all(path)?;
53    }
54    Ok(())
55}
56
57#[derive(ValueEnum, Copy, Clone, Debug, Default, Display)]
58#[strum(serialize_all = "kebab-case")]
59pub enum ResetData {
60    /// Delete the entire temp_directory which contains a few building blocks:
61    ///   "ffmpeg" - used for storing extracted frames
62    ///   "generated_frames" - used for storing generated frames
63    ///   "scene_data.txt" - holds scene timestamps
64    #[default]
65    Everything,
66    /// Nothing will be deleted... meaning we try to continue from where we left off
67    Nothing,
68}