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
66
67
use crate::files::Files;
use crate::utils::is_readable_file;
use crate::{FilesNamed, Result};
use std::path::PathBuf;

#[derive(Debug, Clone)]
pub struct MultipleFiles {
    name: FilesNamed,
    directory: PathBuf,
}

impl MultipleFiles {
    pub fn new(name: FilesNamed, directory: impl Into<PathBuf>) -> Self {
        Self {
            name,
            directory: directory.into(),
        }
    }

    pub fn find(&self) -> Result<Vec<PathBuf>> {
        match &self.name {
            FilesNamed::Exact(name) => {
                let file = self.directory.join(name);
                if is_readable_file(&file) {
                    Ok(vec![file])
                } else {
                    Ok(vec![])
                }
            }
            FilesNamed::Any(names) => {
                let files = names
                    .iter()
                    .map(|each| self.directory.join(each))
                    .filter(|each| is_readable_file(each.as_path()))
                    .collect::<Vec<PathBuf>>();

                Ok(files)
            }
            #[cfg(feature = "regex")]
            FilesNamed::Regex(regex_pattern) => {
                let files = crate::finders::regex_finder::find_files_in_directory_matching(
                    regex_pattern,
                    &self.directory,
                )?;
                Ok(files)
            }
            #[cfg(feature = "wildmatch")]
            FilesNamed::Wildmatch(wildmatch_pattern) => {
                let files = crate::finders::wildmatch_finder::find_files_in_directory_matching(
                    wildmatch_pattern,
                    &self.directory,
                )?;
                Ok(files)
            }
        }
    }
}

impl Files for MultipleFiles {
    fn all(&self) -> Result<Vec<PathBuf>> {
        self.find()
    }

    fn into_files(self) -> Box<dyn Files> {
        Box::new(self)
    }
}