1use serde::{Deserialize, Serialize};
6
7use super::jobs::{HostSample, JobSummary, Sample, Step};
8use super::{Budget, ProfileStatus, Record, RecordRemoval, RepositoryStatus, SlotStatus};
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13pub struct EventEnvelope {
14 pub id: Option<u64>,
16 pub at: u64,
18 #[serde(flatten)]
20 pub event: Event,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
25#[serde(tag = "type")]
26pub enum Event {
27 #[serde(rename = "job.queued")]
29 JobQueued {
30 job: JobSummary,
32 },
33 #[serde(rename = "job.started")]
35 JobStarted {
36 job: JobSummary,
38 },
39 #[serde(rename = "job.step")]
41 JobStep {
42 job: u64,
44 step: Step,
46 },
47 #[serde(rename = "job.finished")]
49 JobFinished {
50 job: JobSummary,
52 },
53 #[serde(rename = "slot.changed")]
55 SlotChanged {
56 profile: String,
58 slot: SlotStatus,
60 },
61 #[serde(rename = "profile.changed")]
65 ProfileChanged {
66 profile: ProfileStatus,
68 },
69 #[serde(rename = "profile.removed")]
71 ProfileRemoved {
72 profile: String,
74 },
75 #[serde(rename = "budget.changed")]
77 BudgetChanged {
78 budget: Budget,
80 },
81 #[serde(rename = "repository.changed")]
84 RepositoryChanged {
85 repository: RepositoryStatus,
87 },
88 #[serde(rename = "repository.removed")]
90 RepositoryRemoved {
91 repository: String,
93 },
94 #[serde(rename = "cache.reseeded")]
96 CacheReseeded {
97 profile: String,
99 output: String,
101 error: Option<String>,
103 },
104 #[serde(rename = "record.created")]
106 RecordCreated {
107 record: Record,
109 },
110 #[serde(rename = "record.deleted")]
112 RecordDeleted {
113 job: u64,
115 removed_by: RecordRemoval,
117 },
118 #[serde(rename = "job.sample")]
120 JobSample {
121 job: u64,
123 sample: Sample,
125 },
126 #[serde(rename = "host.sample")]
128 HostSample {
129 sample: HostSample,
131 },
132 #[serde(rename = "log.line")]
134 LogLine {
135 job: u64,
137 line: u64,
139 text: String,
141 },
142}
143
144impl Event {
145 pub fn kind(&self) -> &'static str {
147 match self {
148 Event::JobQueued { .. } => "job.queued",
149 Event::JobStarted { .. } => "job.started",
150 Event::JobStep { .. } => "job.step",
151 Event::JobFinished { .. } => "job.finished",
152 Event::SlotChanged { .. } => "slot.changed",
153 Event::ProfileChanged { .. } => "profile.changed",
154 Event::ProfileRemoved { .. } => "profile.removed",
155 Event::BudgetChanged { .. } => "budget.changed",
156 Event::RepositoryChanged { .. } => "repository.changed",
157 Event::RepositoryRemoved { .. } => "repository.removed",
158 Event::CacheReseeded { .. } => "cache.reseeded",
159 Event::RecordCreated { .. } => "record.created",
160 Event::RecordDeleted { .. } => "record.deleted",
161 Event::JobSample { .. } => "job.sample",
162 Event::HostSample { .. } => "host.sample",
163 Event::LogLine { .. } => "log.line",
164 }
165 }
166
167 pub fn is_durable(&self) -> bool {
169 !matches!(
170 self,
171 Event::JobSample { .. } | Event::HostSample { .. } | Event::LogLine { .. }
172 )
173 }
174
175 pub fn job(&self) -> Option<u64> {
177 match self {
178 Event::JobQueued { job } | Event::JobStarted { job } | Event::JobFinished { job } => {
179 Some(job.id)
180 }
181 Event::JobStep { job, .. }
182 | Event::JobSample { job, .. }
183 | Event::LogLine { job, .. }
184 | Event::RecordDeleted { job, .. } => Some(*job),
185 Event::RecordCreated { record } => Some(record.job),
186 Event::SlotChanged { .. }
187 | Event::ProfileChanged { .. }
188 | Event::ProfileRemoved { .. }
189 | Event::BudgetChanged { .. }
190 | Event::RepositoryChanged { .. }
191 | Event::RepositoryRemoved { .. }
192 | Event::CacheReseeded { .. }
193 | Event::HostSample { .. } => None,
194 }
195 }
196}
197
198#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
200pub struct EventQuery {
201 pub job: Option<u64>,
203 #[serde(default)]
205 pub logs: bool,
206}
207
208impl EventQuery {
209 pub fn matches(&self, event: &Event) -> bool {
211 (self.logs || !matches!(event, Event::LogLine { .. }))
212 && self.job.is_none_or(|job| event.job() == Some(job))
213 }
214}