mantra-schema 0.8.0

Schemas for *mantra*.
Documentation
use crate::report::{Aggregated, product::ProductMetadata, review::ReviewReference};

#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct ReviewsReportSchema {
    /// The schema version.
    /// [req("exchange.versioned")]
    #[serde(serialize_with = "crate::serialize_schema_version")]
    pub schema_version: Option<String>,
    pub product: ProductMetadata,
    pub reviews: ReviewsOverview,
}

#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
pub struct ReviewsOverview {
    pub summary: ReviewsSummary,
    pub valid: Vec<ReviewReference>,
    pub obsolete: Vec<ReviewReference>,
}

#[derive(
    Debug,
    Clone,
    Copy,
    Default,
    PartialEq,
    serde::Serialize,
    serde::Deserialize,
    schemars::JsonSchema,
)]
#[serde(rename_all = "snake_case")]
pub struct ReviewsSummary {
    pub total: i64,
    pub valid: Aggregated,
    pub obsolete: Aggregated,
}

impl ReviewsSummary {
    pub fn add(&mut self, other: &Self) {
        self.total += other.total;

        self.valid.cnt += other.valid.cnt;
        self.obsolete.cnt += other.obsolete.cnt;

        self.update_percentages();
    }

    pub fn update_percentages(&mut self) {
        self.valid.update_percentage(self.total);
        self.obsolete.update_percentage(self.total);
    }
}