#![allow(unused_assignments)]
use super::*;
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq, Diff)]
#[diff(attr(
#[derive(Debug)]
#[allow(missing_docs)]
))]
pub struct Packages {
pub packages: BTreeMap<String, Package>,
}
#[derive(Error, Debug, Diagnostic)]
#[allow(missing_docs)]
pub enum PackagesError {
#[error("error parsing package {package} in {file}")]
PackageParse {
package: String,
file: String,
#[source]
#[diagnostic_source]
error: PackageError,
},
#[error("internal data structure error occurred")]
Internal,
}
impl Packages {
pub fn add(&mut self, descriptor: &FileDescriptorProto) -> Result<(), PackagesError> {
let name = descriptor.package().to_string();
let Some(package) = self.packages.get_mut(&name) else {
let package =
Package::new(descriptor).map_err(|error| PackagesError::PackageParse {
package: descriptor.package().to_string(),
file: descriptor.name().to_string(),
error,
})?;
self.packages.insert(name, package);
return Ok(());
};
package
.add(descriptor)
.map_err(|_| PackagesError::Internal)?;
Ok(())
}
pub fn check(&self, rules: &mut RuleSet) -> Violations {
let mut violations = rules.check_packages(self);
for package in self.packages.values() {
violations.append(&mut package.check(rules));
}
violations
}
}