use super::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PackagedArtifactGenerationPolicy {
AdjacentSameBodyQuadraticWindows,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum PackagedArtifactGenerationPolicyValidationError {
FieldOutOfSync { field: &'static str },
}
impl PackagedArtifactGenerationPolicyValidationError {
pub fn summary_line(&self) -> String {
match self {
Self::FieldOutOfSync { field } => format!(
"the packaged artifact generation policy field `{field}` is out of sync with the current posture"
),
}
}
}
impl fmt::Display for PackagedArtifactGenerationPolicyValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.summary_line())
}
}
impl std::error::Error for PackagedArtifactGenerationPolicyValidationError {}
impl PackagedArtifactGenerationPolicy {
pub const fn label(self) -> &'static str {
match self {
Self::AdjacentSameBodyQuadraticWindows => "adjacent same-body quadratic windows",
}
}
pub fn note(self) -> &'static str {
match self {
Self::AdjacentSameBodyQuadraticWindows => {
packaged_artifact_generation_policy_note_text()
}
}
}
pub fn segment_strategy(self) -> &'static str {
self.note()
}
pub fn summary_line(self) -> String {
format!("{}; {}", self.label(), self.note())
}
pub fn validate(self) -> Result<(), PackagedArtifactGenerationPolicyValidationError> {
if self != Self::AdjacentSameBodyQuadraticWindows {
return Err(
PackagedArtifactGenerationPolicyValidationError::FieldOutOfSync { field: "policy" },
);
}
Ok(())
}
}
impl fmt::Display for PackagedArtifactGenerationPolicy {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.label())
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PackagedArtifactGenerationPolicySummary {
pub policy: PackagedArtifactGenerationPolicy,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum PackagedArtifactGenerationPolicySummaryValidationError {
FieldOutOfSync { field: &'static str },
}
impl PackagedArtifactGenerationPolicySummaryValidationError {
pub fn summary_line(&self) -> String {
match self {
Self::FieldOutOfSync { field } => format!(
"the packaged artifact generation policy summary field `{field}` is out of sync with the current posture"
),
}
}
}
impl fmt::Display for PackagedArtifactGenerationPolicySummaryValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.summary_line())
}
}
impl std::error::Error for PackagedArtifactGenerationPolicySummaryValidationError {}
pub(crate) fn validate_packaged_artifact_generation_policy_residual_bodies(
policy: PackagedArtifactGenerationPolicy,
residual_bodies: &[CelestialBody],
) -> Result<(), PackagedArtifactGenerationPolicySummaryValidationError> {
match policy {
PackagedArtifactGenerationPolicy::AdjacentSameBodyQuadraticWindows => {
let expected_residual_bodies = packaged_artifact().residual_bodies();
if residual_bodies != expected_residual_bodies.as_slice() {
return Err(
PackagedArtifactGenerationPolicySummaryValidationError::FieldOutOfSync {
field: "residual_bodies",
},
);
}
}
}
Ok(())
}
impl PackagedArtifactGenerationPolicySummary {
pub fn summary_line(self) -> String {
self.policy.summary_line()
}
pub fn validate(&self) -> Result<(), PackagedArtifactGenerationPolicySummaryValidationError> {
self.policy.validate().map_err(|error| match error {
PackagedArtifactGenerationPolicyValidationError::FieldOutOfSync { field } => {
PackagedArtifactGenerationPolicySummaryValidationError::FieldOutOfSync { field }
}
})?;
validate_packaged_artifact_generation_policy_residual_bodies(
self.policy,
&packaged_artifact().residual_bodies(),
)
}
}
impl fmt::Display for PackagedArtifactGenerationPolicySummary {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.summary_line())
}
}
const PACKAGED_ARTIFACT_GENERATION_POLICY_SUMMARY: PackagedArtifactGenerationPolicySummary =
PackagedArtifactGenerationPolicySummary {
policy: PackagedArtifactGenerationPolicy::AdjacentSameBodyQuadraticWindows,
};
pub fn packaged_artifact_generation_policy_summary_details(
) -> PackagedArtifactGenerationPolicySummary {
let summary = PACKAGED_ARTIFACT_GENERATION_POLICY_SUMMARY;
debug_assert!(summary.validate().is_ok());
summary
}
pub fn packaged_artifact_generation_residual_bodies_summary_details(
) -> ArtifactResidualBodyCoverageSummary {
let artifact = packaged_artifact();
let summary = artifact.residual_body_coverage_summary();
debug_assert!(summary.validate(artifact).is_ok());
summary
}
pub fn packaged_artifact_generation_policy_summary() -> &'static str {
static SUMMARY: OnceLock<String> = OnceLock::new();
SUMMARY
.get_or_init(|| {
let summary = packaged_artifact_generation_policy_summary_details();
match summary.validate() {
Ok(()) => summary.to_string(),
Err(error) => format!("Packaged-artifact generation policy: unavailable ({error})"),
}
})
.as_str()
}