use crate::{Metric, Verdict, VerdictStatus};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct RepairContextReceipt {
pub schema: String,
pub benchmark: String,
pub verdict: Verdict,
pub status: VerdictStatus,
pub breached_metrics: Vec<RepairMetricBreach>,
#[serde(skip_serializing_if = "Option::is_none")]
pub compare_receipt_path: Option<String>,
pub report_path: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub profile_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub git: Option<RepairGitMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub changed_files: Option<ChangedFilesSummary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub otel_span: Option<OtelSpanIdentifiers>,
pub recommended_next_commands: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct RepairMetricBreach {
pub metric: Metric,
pub status: String,
pub baseline: f64,
pub current: f64,
pub regression: f64,
pub fail_threshold: f64,
pub warn_threshold: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct RepairGitMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub branch: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sha: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct ChangedFilesSummary {
pub file_count: u32,
pub files: Vec<String>,
pub file_count_by_top_level: BTreeMap<String, u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct OtelSpanIdentifiers {
#[serde(skip_serializing_if = "Option::is_none")]
pub trace_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub span_id: Option<String>,
}