use serde::Serialize;
use crate::protocol::journal::RunStatus;
use crate::protocol::release::VerifyOutcome;
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ReconcileReport {
pub run_id: String,
pub plan_id: String,
pub run_status: RunStatus,
pub journal_seq: u64,
pub targets: Vec<TargetReconcile>,
pub summary: ReconcileSummary,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct TargetReconcile {
pub target: String,
pub ecosystem: String,
pub package: Option<String>,
pub version: String,
pub outcome: VerifyOutcome,
#[serde(skip_serializing_if = "Option::is_none")]
pub detail: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delegated_run: Option<DelegatedRun>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum DelegatedRunStatus {
Pending,
Success,
Failed,
Unknown,
}
impl DelegatedRunStatus {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::Pending => "pending",
Self::Success => "success",
Self::Failed => "failed",
Self::Unknown => "unknown",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct DelegatedJobFailure {
pub name: String,
pub conclusion: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct DelegatedRun {
pub provider: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub workflow: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub run_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
pub status: DelegatedRunStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub conclusion: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub failed_jobs: Vec<DelegatedJobFailure>,
#[serde(skip_serializing_if = "Option::is_none")]
pub detail: Option<String>,
}
impl DelegatedRun {
#[must_use]
pub(crate) fn unknown(workflow: Option<String>, run_id: Option<u64>, detail: String) -> Self {
Self {
provider: "github-actions".to_string(),
workflow,
run_id,
url: None,
status: DelegatedRunStatus::Unknown,
conclusion: None,
failed_jobs: Vec::new(),
detail: Some(detail),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize)]
pub struct ReconcileSummary {
pub reconciled: usize,
pub matches: usize,
pub conflicts: usize,
pub missing: usize,
pub unknown: usize,
pub delegated_pending: usize,
pub delegated_failed: usize,
}