use std::path::Path;
use rayon::prelude::*;
use sdivi_config::Config;
use crate::adapter::LanguageAdapter;
use crate::feature_record::FeatureRecord;
use crate::walker::collect_files;
pub fn parse_repository(
config: &Config,
repo_root: &Path,
adapters: &[Box<dyn LanguageAdapter>],
) -> Vec<FeatureRecord> {
if adapters.is_empty() {
return Vec::new();
}
let files = collect_files(config, repo_root);
let mut records: Vec<FeatureRecord> = files
.into_par_iter()
.filter_map(|path| {
let ext = path
.extension()
.and_then(|e| e.to_str())
.map(|e| format!(".{e}"))?;
let adapter = adapters
.iter()
.find(|a| a.file_extensions().contains(&ext.as_str()))?;
let content = std::fs::read_to_string(&path).ok()?;
let relative = path.strip_prefix(repo_root).unwrap_or(&path).to_path_buf();
let record = adapter.parse_file(&relative, content);
Some(record)
})
.collect();
records.sort_by(|a, b| a.path.cmp(&b.path));
records
}