use anyhow::Result;
use std::collections::BTreeMap;
use std::path::Path;
use crate::settings::config_file::ConfigFile;
use crate::settings::package_config::PackageConfig;
pub struct PackageSections {
sections: BTreeMap<String, PackageConfig>,
}
impl PackageSections {
pub fn new(sections: BTreeMap<String, PackageConfig>) -> Self {
Self { sections }
}
pub fn load(directory: &Path) -> Result<Self> {
Ok(Self::new(
ConfigFile::load(directory)?
.map(|file| file.packages)
.unwrap_or_default(),
))
}
pub fn of(&self, name: &str) -> Option<&PackageConfig> {
self.sections.get(name)
}
pub fn skipped_anywhere(&self, scanned: &[&str]) -> Vec<String> {
let mut skipped: Vec<String> = self
.sections
.iter()
.filter(|(name, _)| scanned.contains(&name.as_str()))
.flat_map(|(_, section)| section.skip.iter().cloned())
.collect();
skipped.sort();
skipped.dedup();
skipped
}
pub fn is_empty(&self) -> bool {
self.sections.is_empty()
}
pub fn validate(&self, workspace: &[&str]) -> Result<()> {
let unknown: Vec<&str> = self
.sections
.keys()
.map(String::as_str)
.filter(|name| !workspace.contains(name))
.collect();
if unknown.is_empty() {
return Ok(());
}
Err(anyhow::anyhow!(
"{} configures package(s) that are not in this workspace: {} -- it holds: {}",
ConfigFile::NAME,
unknown.join(", "),
workspace.join(", ")
))
}
}