grace_cli/commands/recase/
files.rs1use 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}