use anodizer_core::config::{Config, CrateConfig, VersionFileEntry};
pub(crate) fn resolve_version_files(
crate_cfg: Option<&CrateConfig>,
config: Option<&Config>,
) -> Vec<VersionFileEntry> {
crate_cfg
.and_then(|c| c.version_files.clone())
.or_else(|| config.and_then(|c| c.version_files.clone()))
.unwrap_or_default()
}
pub(crate) struct EnrolledUnit {
pub owner: String,
pub path: String,
pub files: Vec<VersionFileEntry>,
pub is_lockstep_root: bool,
}
impl EnrolledUnit {
pub fn label(&self) -> String {
if self.is_lockstep_root {
"workspace".to_string()
} else {
format!("crate '{}'", self.owner)
}
}
}
pub(crate) fn enrolled_units(config: &Config) -> Vec<EnrolledUnit> {
let top_level = config.version_files.as_deref().unwrap_or_default();
let all_crates: Vec<&CrateConfig> = config.crate_universe();
let mut units: Vec<EnrolledUnit> = all_crates
.iter()
.filter_map(|c| {
let files = resolve_version_files(Some(c), Some(config));
(!files.is_empty()).then(|| EnrolledUnit {
owner: c.name.clone(),
path: c.path.clone(),
files,
is_lockstep_root: false,
})
})
.collect();
if all_crates.is_empty() && !top_level.is_empty() {
units.push(EnrolledUnit {
owner: config.project_name.clone(),
path: ".".to_string(),
files: top_level.to_vec(),
is_lockstep_root: true,
});
}
units
}