use super::*;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PackagedBodyCoverageSummary {
pub body_count: usize,
pub bodies: Vec<CelestialBody>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum PackagedBodyCoverageSummaryValidationError {
FieldOutOfSync { field: &'static str },
}
impl fmt::Display for PackagedBodyCoverageSummaryValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::FieldOutOfSync { field } => write!(
f,
"the packaged body coverage summary field `{field}` is out of sync with the current bundled body set"
),
}
}
}
impl std::error::Error for PackagedBodyCoverageSummaryValidationError {}
impl PackagedBodyCoverageSummary {
pub fn summary_line(&self) -> String {
format!(
"Packaged body set: {} bundled bodies ({})",
self.body_count,
join_display(&self.bodies)
)
}
pub fn validate(&self) -> Result<(), PackagedBodyCoverageSummaryValidationError> {
let expected_bodies = packaged_bodies();
if self.body_count != expected_bodies.len() {
return Err(PackagedBodyCoverageSummaryValidationError::FieldOutOfSync {
field: "body_count",
});
}
if self.bodies.as_slice() != expected_bodies {
return Err(PackagedBodyCoverageSummaryValidationError::FieldOutOfSync {
field: "bodies",
});
}
Ok(())
}
pub fn validated_summary_line(
&self,
) -> Result<String, PackagedBodyCoverageSummaryValidationError> {
self.validate()?;
Ok(self.summary_line())
}
}
impl fmt::Display for PackagedBodyCoverageSummary {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.summary_line())
}
}
pub fn packaged_body_coverage_summary_details() -> PackagedBodyCoverageSummary {
let bodies = packaged_bodies().to_vec();
PackagedBodyCoverageSummary {
body_count: bodies.len(),
bodies,
}
}