use ignore::{WalkBuilder};
use ignore::gitignore::{Gitignore, GitignoreBuilder};
use std::path::PathBuf;
use crate::vaultgate::{GateConfig, GateHit};
pub fn scan_files(cfg: &GateConfig) -> Vec<GateHit> {
let gi = build_matcher(cfg);
let mut hits = Vec::new();
for result in WalkBuilder::new(&cfg.root_dir)
.standard_filters(false)
.build()
{
match result {
Ok(ent) => {
let path = ent.path().to_path_buf();
let rel = path.strip_prefix(&cfg.root_dir).unwrap_or(&path).to_path_buf();
let is_dir = ent.file_type().map(|ft| ft.is_dir()).unwrap_or(false);
let m = gi.matched_path_or_any_parents(&path, is_dir);
let decision = if m.is_ignore() {
"IGNORE"
} else {
"INCLUDE"
};
hits.push(GateHit::ok(rel, path, is_dir, decision, None));
}
Err(_) => continue,
}
}
hits
}
fn build_matcher(cfg: &GateConfig) -> Gitignore {
let mut builder = GitignoreBuilder::new(&cfg.root_dir);
for pattern in &cfg.ignore_patterns {
let _ = builder.add_line(None, pattern);
}
builder.build().unwrap_or_else(|_| Gitignore::empty())
}