grace_cli/commands/recase/
files.rs

1use walkdir::WalkDir;
2
3use crate::arguments::formats_to_recase::preprocess_formats;
4use crate::arguments::into::Into;
5use crate::commands::recase::file::{
6    extract_file_name_and_extension, recase_directory, recase_file,
7};
8use crate::core::file::file::{File, FileErr};
9
10pub fn recase_files(
11    directory: Option<String>,
12    into: &Into,
13    is_sanitize: &bool,
14    formats_to_recase: &[String],
15    is_recursive: &bool,
16    folders: &bool,
17) -> Result<(), FileErr> {
18    let formats = preprocess_formats(formats_to_recase);
19
20    if *is_recursive {
21        recase_recursively(directory.clone(), into, is_sanitize, &formats)?;
22    } else {
23        recase(directory.clone(), into, is_sanitize, &formats, folders)?;
24    }
25
26    Ok(())
27}
28
29fn recase(
30    directory: Option<String>,
31    into: &Into,
32    is_sanitize: &bool,
33    formats_to_recase: &[String],
34    folders: &bool,
35) -> Result<(), FileErr> {
36    let provided_directory = directory.as_deref().unwrap();
37    let file_path = File::new(provided_directory);
38
39    let files_to_recase = match file_path.read_dir() {
40        Ok(files) => filter_files_by_formats(files, formats_to_recase, folders),
41        Err(err) => return Err(err),
42    };
43
44    let directory_with_slash = maybe_add_slash_to_directory(provided_directory);
45
46    for file in files_to_recase {
47        let full_path = format!("{}{}", directory_with_slash, file);
48        let path = File::new(&full_path);
49
50        if path.is_dir() && *folders {
51            recase_directory(Some(full_path), into, is_sanitize)?;
52        } else if path.is_file() {
53            recase_file(
54                Some(format!("{}{}", directory_with_slash, file)),
55                into,
56                is_sanitize,
57            )?;
58        }
59    }
60
61    Ok(())
62}
63
64fn maybe_add_slash_to_directory(directory: &str) -> String {
65    if directory.ends_with('/') {
66        directory.to_string()
67    } else {
68        format!("{}/", directory)
69    }
70}
71
72fn filter_files_by_formats(
73    files: Vec<String>,
74    files_formats: &[String],
75    include_folders: &bool,
76) -> Vec<String> {
77    if files_formats.is_empty() {
78        return files;
79    }
80
81    files
82        .into_iter()
83        .filter(|file| {
84            let (_, file_extension) = extract_file_name_and_extension(&File::new(file.as_str()));
85
86            files_formats.contains(&file_extension) || *include_folders
87        })
88        .collect()
89}
90
91fn recase_recursively(
92    directory: Option<String>,
93    into: &Into,
94    is_sanitize: &bool,
95    formats_to_recase: &[String],
96) -> Result<(), FileErr> {
97    for entry in WalkDir::new(directory.unwrap())
98        .into_iter()
99        .filter_map(|e| e.ok())
100    {
101        let file = File::new(entry.path().to_str().unwrap());
102        let entry_path_string = entry.path().to_str().unwrap().to_string();
103
104        let (_, file_extension) = extract_file_name_and_extension(&file);
105
106        if !formats_to_recase.is_empty()
107            && formats_to_recase.contains(&file_extension)
108            && file.is_file()
109        {
110            recase_file(Some(entry_path_string), into, is_sanitize)?;
111        }
112    }
113    Ok(())
114}