pub const DEFAULT_HUB_MAX_INDEGREE: usize = 34;
const INFRA_BASENAMES: [&str; 2] = ["program.cs", "startup.cs"];
const INFRA_SUFFIXES: [&str; 8] = [
"serviceextensions.cs",
"servicecollectionextensions.cs",
"registration.cs",
"testbase.cs",
"testsbase.cs",
"basetest.cs",
"basetests.cs",
"basefixture.cs",
];
const INFRA_DIR: &str = "dependencyresolution/";
const COMPOSITION_ROOT: &str = "compositionroot";
pub fn is_infra_file(file: &str) -> bool {
let lower = file.to_lowercase();
let base = match lower.rfind('/') {
Some(i) => &lower[i + 1..],
None => &lower[..],
};
if INFRA_BASENAMES.contains(&base) {
return true;
}
if INFRA_SUFFIXES.iter().any(|sfx| lower.ends_with(sfx)) {
return true;
}
if lower.starts_with(INFRA_DIR) || lower.contains(&format!("/{INFRA_DIR}")) {
return true;
}
if let Some(at) = base.find(COMPOSITION_ROOT) {
if base.ends_with(".cs") {
let middle = &base[at + COMPOSITION_ROOT.len()..base.len() - 3];
if middle.chars().all(|c| c.is_ascii_alphanumeric()) {
return true;
}
}
}
false
}