use std::collections::{BTreeMap, BTreeSet};
use serde::{Deserialize, Serialize};
use crate::model::apply::ApplyForecast;
use crate::model::batch::PinPayload;
use crate::model::evaluation::{
AggregateVerdict, BehaviourModuleMissingFinding, HeaderFileMissingFinding,
SeriesEvaluationView, TestModuleSymbolMissingFinding, VersionedMachineSnapshotMissingFinding,
WireConstantBindingsMissingFinding,
};
use crate::model::findings::TargetFindings;
use crate::model::fingerprint::VerdictFingerprint;
use crate::model::names::{ModuleName, ProjectName, RelativePath, SeriesName, TagName};
use crate::model::pin::Pin;
use crate::model::pr_commit::PrCommit;
use crate::model::producer::Producer;
use crate::model::resolver_coverage::ResolverCoverage;
use crate::model::summary::VerdictKind;
use crate::model::verdict::{Diagnostics, PinVerdict, Reason, SeriesVerdict};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct ProjectSuggestion {
pub name: String,
pub modules: Vec<String>,
pub call_sites: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum QueriedAgainst {
Pin { project: ProjectName, tag: TagName },
Series {
name: SeriesName,
pins: Vec<PinPayload>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct CheckPayload {
pub queried_against: QueriedAgainst,
pub results: SeriesVerdict,
#[serde(default, skip_serializing_if = "Diagnostics::is_empty")]
pub diagnostics: Diagnostics,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub project_suggestions: Vec<ProjectSuggestion>,
#[serde(default)]
pub pr_commits: Option<Vec<PrCommit>>,
#[serde(default)]
pub self_projects: Option<BTreeSet<ProjectName>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub verdict_fingerprint: Option<VerdictFingerprint>,
#[serde(default)]
pub resolver_coverage: Option<ResolverCoverage>,
#[serde(default)]
pub fingerprint_version: Option<u32>,
#[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>,
}
impl CheckPayload {
#[must_use]
pub fn view(&self) -> SeriesEvaluationView<'_> {
SeriesEvaluationView::new(&self.results, &self.diagnostics)
}
#[must_use]
pub fn producer(&self) -> Producer<'_> {
Producer::from_fields(
self.self_projects.as_ref(),
self.resolver_coverage.as_ref(),
self.fingerprint_version,
)
}
#[must_use]
pub fn tracked_refs(&self) -> Option<u32> {
match self.producer() {
Producer::Current { self_projects, .. } => {
Some(self.view().tracked_refs(self_projects))
}
Producer::BeforeV12 => None,
}
}
#[must_use]
pub fn worst_verdict(&self) -> AggregateVerdict {
self.view().worst_verdict()
}
#[must_use]
pub fn has_blocking_reason(&self) -> bool {
self.view().has_blocking_reason()
}
pub fn pins_in(&self, verdict: VerdictKind) -> impl Iterator<Item = &PinVerdict> {
self.view().pins_in(verdict)
}
pub fn reasons_for(&self, pin: &Pin) -> impl Iterator<Item = &Reason> {
self.view().reasons_for(pin)
}
#[must_use]
pub fn pin_by_project(&self, project: &ProjectName) -> Option<&PinVerdict> {
self.view().pin_by_project(project)
}
#[must_use]
pub fn missing_test_modules(&self) -> &BTreeMap<RelativePath, BTreeMap<ModuleName, usize>> {
self.view().missing_test_modules()
}
pub fn test_module_symbol_missing(
&self,
) -> impl Iterator<Item = TestModuleSymbolMissingFinding<'_>> {
self.view().test_module_symbol_missing()
}
pub fn header_file_missing(&self) -> impl Iterator<Item = HeaderFileMissingFinding<'_>> {
self.view().header_file_missing()
}
pub fn behaviour_module_missing(
&self,
) -> impl Iterator<Item = BehaviourModuleMissingFinding<'_>> {
self.view().behaviour_module_missing()
}
pub fn versioned_machine_snapshot_missing(
&self,
) -> impl Iterator<Item = VersionedMachineSnapshotMissingFinding<'_>> {
self.view().versioned_machine_snapshot_missing()
}
pub fn wire_constant_bindings_missing(
&self,
) -> impl Iterator<Item = WireConstantBindingsMissingFinding<'_>> {
self.view().wire_constant_bindings_missing()
}
}