context_builder/
file_utils.rs

1use ignore::{WalkBuilder, DirEntry};
2use std::io::{self, Write};
3use std::path::Path;
4
5/// Collects all files to be processed using `ignore` crate for efficient traversal.
6pub fn collect_files(base_path: &Path, filters: &[String], ignores: &[String]) -> io::Result<Vec<DirEntry>> {
7    let mut walker = WalkBuilder::new(base_path);
8    // By default, the ignore crate respects .gitignore and hidden files, so we don't need walker.hidden(false)
9
10    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
28/// Asks for user confirmation if the number of files is large.
29pub 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
42/// Asks for user confirmation to overwrite an existing file.
43pub 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}