use std::collections::BTreeSet;
use std::num::NonZeroU32;
use serde::{Deserialize, Serialize};
use crate::model::apply::ApplyForecast;
use crate::model::clearance::RoundClearance;
use crate::model::findings::TargetFindings;
use crate::model::fingerprint::VerdictFingerprint;
use crate::model::names::{CommitSha, ProjectName, RelativePath, SeriesName, TagName};
use crate::model::pin::Pin;
use crate::model::pr_commit::PrCommit;
use crate::model::resolver_coverage::ResolverCoverage;
use crate::model::verdict::{Diagnostics, PatchFacts, SeriesVerdict};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct BatchPayload {
pub queried_against: Vec<BatchQuery>,
pub results: Vec<BatchResult>,
#[serde(default)]
pub self_projects: Option<BTreeSet<ProjectName>>,
#[serde(default)]
pub resolver_coverage: Option<ResolverCoverage>,
#[serde(default)]
pub fingerprint_version: Option<u32>,
}
impl BatchPayload {
#[must_use]
pub fn clearance(&self, self_projects: &BTreeSet<ProjectName>) -> RoundClearance {
RoundClearance::from_results(&self.results, self_projects)
}
#[must_use]
pub fn clearance_self_inferred(&self) -> Option<RoundClearance> {
self.self_projects
.as_ref()
.map(|projects| self.clearance(projects))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct BatchQuery {
pub series: SeriesName,
pub pins: Vec<PinPayload>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct PinPayload {
pub project: ProjectName,
pub tag: TagName,
}
impl From<&Pin> for PinPayload {
fn from(pin: &Pin) -> Self {
Self {
project: pin.project.clone(),
tag: pin.tag.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct BatchResult {
pub commit: CommitSha,
pub series: SeriesName,
pub verdict: SeriesVerdict,
#[serde(default, skip_serializing_if = "Diagnostics::is_empty")]
pub diagnostics: Diagnostics,
#[serde(default, skip_serializing_if = "PatchFacts::is_empty")]
pub patch_facts: PatchFacts,
#[serde(default)]
pub touched_paths: Vec<RelativePath>,
#[serde(default)]
pub pr_commits: Option<Vec<PrCommit>>,
#[serde(default)]
pub parent_count: Option<NonZeroU32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub verdict_fingerprint: Option<VerdictFingerprint>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub apply: Option<ApplyForecast>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub target_findings: Option<TargetFindings>,
}