context_builder/
file_utils.rs1use ignore::{WalkBuilder, DirEntry};
2use std::io::{self, Write};
3use std::path::Path;
4
5pub fn collect_files(base_path: &Path, filters: &[String], ignores: &[String]) -> io::Result<Vec<DirEntry>> {
7 let mut walker = WalkBuilder::new(base_path);
8 for ignore_pattern in ignores {
11 walker.add_ignore(ignore_pattern);
12 }
13
14 if !filters.is_empty() {
15 let mut type_builder = ignore::types::TypesBuilder::new();
16 type_builder.add_defaults();
17 for filter in filters {
18 let _ = type_builder.add(filter, &format!("*.{}", filter));
19 type_builder.select(filter);
20 }
21 let types = type_builder.build().unwrap();
22 walker.types(types);
23 }
24
25 Ok(walker.build().filter_map(Result::ok).filter(|e| e.file_type().map_or(false, |ft| ft.is_file())).collect())
26}
27
28pub fn confirm_processing(file_count: usize) -> io::Result<bool> {
30 if file_count > 100 {
31 print!("Warning: You're about to process {} files. This might take a while. Continue? [y/N] ", file_count);
32 io::stdout().flush()?;
33 let mut input = String::new();
34 io::stdin().read_line(&mut input)?;
35 if !input.trim().eq_ignore_ascii_case("y") {
36 return Ok(false);
37 }
38 }
39 Ok(true)
40}
41
42pub fn confirm_overwrite(file_path: &str) -> io::Result<bool> {
44 print!("The file '{}' already exists. Overwrite? [y/N] ", file_path);
45 io::stdout().flush()?;
46 let mut input = String::new();
47 io::stdin().read_line(&mut input)?;
48 if input.trim().eq_ignore_ascii_case("y") {
49 Ok(true)
50 } else {
51 Ok(false)
52 }
53}