use serde::{Deserialize, Serialize};
use super::jobs::{HostSample, JobSummary, Sample, Step};
use super::{Budget, RepositoryStatus, SlotStatus};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct EventEnvelope {
pub id: Option<u64>,
pub at: u64,
#[serde(flatten)]
pub event: Event,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Event {
#[serde(rename = "job.queued")]
JobQueued {
job: JobSummary,
},
#[serde(rename = "job.started")]
JobStarted {
job: JobSummary,
},
#[serde(rename = "job.step")]
JobStep {
job: u64,
step: Step,
},
#[serde(rename = "job.finished")]
JobFinished {
job: JobSummary,
},
#[serde(rename = "slot.changed")]
SlotChanged {
profile: String,
slot: SlotStatus,
},
#[serde(rename = "budget.changed")]
BudgetChanged {
budget: Budget,
},
#[serde(rename = "repository.changed")]
RepositoryChanged {
repository: RepositoryStatus,
},
#[serde(rename = "repository.removed")]
RepositoryRemoved {
repository: String,
},
#[serde(rename = "cache.reseeded")]
CacheReseeded {
profile: String,
output: String,
error: Option<String>,
},
#[serde(rename = "job.sample")]
JobSample {
job: u64,
sample: Sample,
},
#[serde(rename = "host.sample")]
HostSample {
sample: HostSample,
},
#[serde(rename = "log.line")]
LogLine {
job: u64,
line: u64,
text: String,
},
}
impl Event {
pub fn kind(&self) -> &'static str {
match self {
Event::JobQueued { .. } => "job.queued",
Event::JobStarted { .. } => "job.started",
Event::JobStep { .. } => "job.step",
Event::JobFinished { .. } => "job.finished",
Event::SlotChanged { .. } => "slot.changed",
Event::BudgetChanged { .. } => "budget.changed",
Event::RepositoryChanged { .. } => "repository.changed",
Event::RepositoryRemoved { .. } => "repository.removed",
Event::CacheReseeded { .. } => "cache.reseeded",
Event::JobSample { .. } => "job.sample",
Event::HostSample { .. } => "host.sample",
Event::LogLine { .. } => "log.line",
}
}
pub fn is_durable(&self) -> bool {
!matches!(
self,
Event::JobSample { .. } | Event::HostSample { .. } | Event::LogLine { .. }
)
}
pub fn job(&self) -> Option<u64> {
match self {
Event::JobQueued { job } | Event::JobStarted { job } | Event::JobFinished { job } => {
Some(job.id)
}
Event::JobStep { job, .. }
| Event::JobSample { job, .. }
| Event::LogLine { job, .. } => Some(*job),
Event::SlotChanged { .. }
| Event::BudgetChanged { .. }
| Event::RepositoryChanged { .. }
| Event::RepositoryRemoved { .. }
| Event::CacheReseeded { .. }
| Event::HostSample { .. } => None,
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct EventQuery {
pub job: Option<u64>,
#[serde(default)]
pub logs: bool,
}
impl EventQuery {
pub fn matches(&self, event: &Event) -> bool {
(self.logs || !matches!(event, Event::LogLine { .. }))
&& self.job.is_none_or(|job| event.job() == Some(job))
}
}