1use serde::Deserialize;
4use std::fmt;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Deserialize)]
20#[serde(rename_all = "lowercase")]
21pub enum Severity {
22 Low = 1,
24 Medium = 2,
26 High = 3,
28 Critical = 4,
30}
31
32impl fmt::Display for Severity {
33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34 match self {
35 Self::Low => write!(f, "Low"),
36 Self::Medium => write!(f, "Medium"),
37 Self::High => write!(f, "High"),
38 Self::Critical => write!(f, "Critical"),
39 }
40 }
41}
42
43#[derive(Debug, Clone, PartialEq, Deserialize)]
45pub struct Baseline {
46 #[serde(default)]
48 pub branch: Option<String>,
49 #[serde(default)]
51 pub commit: Option<String>,
52 #[serde(default)]
54 pub repo_url: Option<String>,
55}
56
57#[derive(Debug, Clone, PartialEq, Deserialize)]
59pub struct MailingList {
60 pub name: String,
62 #[serde(default)]
64 pub group: Option<String>,
65}
66
67#[derive(Debug, Clone, PartialEq, Deserialize)]
69pub struct ServerStats {
70 pub status: String,
72 pub version: String,
74 #[serde(default)]
76 pub pending: u64,
77 #[serde(default)]
79 pub reviewing: u64,
80 #[serde(default)]
82 pub messages: u64,
83 #[serde(default)]
85 pub patchsets: u64,
86}
87
88#[derive(Debug, Clone, PartialEq, Eq, Hash)]
92pub enum PatchId {
93 Numeric(i64),
95 MessageId(String),
97}
98
99impl fmt::Display for PatchId {
100 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
101 match self {
102 Self::Numeric(id) => write!(f, "{id}"),
103 Self::MessageId(mid) => write!(f, "{mid}"),
104 }
105 }
106}
107
108#[cfg(test)]
109#[allow(clippy::expect_used)]
110mod tests {
111 use super::*;
112
113 #[test]
114 fn severity_ordering() {
115 let mut severities = vec![
116 Severity::Critical,
117 Severity::Low,
118 Severity::High,
119 Severity::Medium,
120 ];
121 severities.sort();
122 assert_eq!(
123 severities,
124 vec![
125 Severity::Low,
126 Severity::Medium,
127 Severity::High,
128 Severity::Critical,
129 ]
130 );
131 }
132
133 #[test]
134 fn severity_display() {
135 assert_eq!(Severity::Low.to_string(), "Low");
136 assert_eq!(Severity::Critical.to_string(), "Critical");
137 }
138
139 #[test]
140 fn patch_id_display() {
141 let numeric = PatchId::Numeric(42);
142 assert_eq!(numeric.to_string(), "42");
143
144 let msg = PatchId::MessageId("20260513-foo@example.com".to_string());
145 assert_eq!(msg.to_string(), "20260513-foo@example.com");
146 }
147}