use serde::{Deserialize, Serialize};
use super::RunnerFailure;
use super::jobs::JobSummary;
mod shown;
pub const INSIGHT_DAYS: u32 = 14;
pub const INSIGHT_DAYS_MAX: u32 = 90;
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct InsightsQuery {
pub days: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Insights {
pub since: u64,
pub until: u64,
pub insights: Vec<Insight>,
pub waits: Vec<RepositoryWaits>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Severity {
Warning,
Notice,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Insight {
pub key: String,
pub severity: Severity,
pub repository: String,
pub workflow: Option<String>,
pub job: Option<String>,
pub sentence: String,
#[serde(flatten)]
pub kind: InsightKind,
pub runs: Vec<RunLink>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case", tag = "kind")]
pub enum InsightKind {
Slower {
branch: Option<String>,
before: u64,
now: u64,
since: Option<RunLink>,
},
Flaky {
flaky: u32,
total: u32,
},
NearCap {
profile: String,
peak: u64,
cap: u64,
auto: AutoNote,
},
ColdCache {
branch: Option<String>,
hits: u64,
lookups: u64,
},
Throttled {
throttled: u32,
total: u32,
},
Waits {
before: u64,
now: u64,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum AutoNote {
Raises,
AtMax,
Off,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RunLink {
pub job: u64,
pub run_id: u64,
pub run_attempt: u32,
pub branch: Option<String>,
pub url: Option<String>,
pub at: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryWaits {
pub repository: String,
pub now: WeekWaits,
pub before: WeekWaits,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct WeekWaits {
pub all: WaitSpread,
pub warm: WaitSpread,
pub cold: WaitSpread,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct WaitSpread {
pub jobs: u32,
pub p50: Option<u64>,
pub p95: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Digest {
pub since: u64,
pub until: u64,
pub finished: u64,
pub failed: u64,
pub new: Vec<Insight>,
pub waits: Vec<LongWait>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LongWait {
pub job: u64,
pub repository: String,
pub workflow: Option<String>,
pub name: String,
pub waited: u64,
pub url: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum NotifyEvent {
Failed,
Lost,
Runner,
Insights,
Digest,
Test,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Priority {
Low,
Default,
High,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Notification {
pub event: NotifyEvent,
pub title: String,
pub message: String,
pub url: Option<String>,
pub priority: Priority,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub jobs: Vec<JobSummary>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub runners: Vec<RunnerFailure>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub insights: Vec<Insight>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub digest: Option<Digest>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct NotifyTestQuery {
pub target: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct NotifyTest {
pub targets: Vec<Delivery>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Delivery {
pub target: String,
pub error: Option<String>,
}