1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use crate::FileListerError;
use serde::{Deserialize, Serialize};
use std::path::Path;
use std::path::PathBuf;
use thiserror::Error;
use walkdir::WalkDir;
use warp::reject::Reject;

#[derive(Serialize, Deserialize)]
pub struct FolderDump {
    content: Vec<String>,
    #[serde(skip_serializing)]
    root: PathBuf,
}

impl FolderDump {
    pub fn new<P: AsRef<Path>>(root: P) -> Self {
        Self {
            content: Vec::new(),
            root: root.as_ref().to_path_buf(),
        }
    }

    pub fn push<S: Into<String>>(&mut self, data: S) {
        let item = data.into();
        let root_file_name = format!("{}", self.root.display());
        self.content
            .push(item.replace(&root_file_name, "").replace("'\\'", "/"));
    }

    pub fn find_file_with_extension<S: Into<String>>(
        &self,
        job_id: S,
        extension: S,
    ) -> Option<&String> {
        let job_id = job_id.into();
        let extension = extension.into();
        self.content
            .iter()
            .find(|x| x.contains(&job_id) && x.ends_with(&extension))
    }
}

impl Reject for FileListerError {}

#[allow(clippy::large_enum_variant)]
#[derive(Debug, Error)]
pub enum Error {
    #[error("root folder does not exist yet. try to start backend")]
    RootFolderDoesNotExist(#[from] walkdir::Error),
}

pub fn dump_json<P: AsRef<Path>>(root: P) -> Result<FolderDump, Error> {
    let walker = WalkDir::new(root.as_ref()).into_iter();
    let mut data: FolderDump = FolderDump::new(root);

    for entry in walker {
        let entry = entry?;
        let md = std::fs::metadata(entry.path()).unwrap();
        if !md.is_dir() {
            data.push(format!("{}", entry.path().display()));
        }
    }
    Ok(data)
}