use std::collections::HashMap;
use crate::error::JobError;
use crate::request::JobRequest;
use crate::request::JobState;
use crate::worker::WorkerId;
use chrono::DateTime;
use chrono::Utc;
use serde::Deserialize;
use serde::Serialize;
#[derive(Debug, Serialize, Deserialize)]
pub struct ExposedWorker {
worker_id: WorkerId,
job_type: String,
source: String,
layers: String,
last_seen: DateTime<Utc>,
}
impl ExposedWorker {
pub fn new<S, T>(worker_id: WorkerId, layers: String, last_seen: DateTime<Utc>) -> Self {
ExposedWorker {
worker_id,
job_type: std::any::type_name::<T>().to_string(),
source: std::any::type_name::<S>().to_string(),
layers,
last_seen,
}
}
}
#[derive(Debug, Deserialize, Serialize, Default)]
pub struct JobStateCount {
#[serde(flatten)]
counts: HashMap<JobState, u32>,
}
impl JobStateCount {
pub fn new(counts: HashMap<JobState, u32>) -> Self {
Self { counts }
}
}
#[async_trait::async_trait]
pub trait JobStreamExt<Job>
where
Self: Sized,
{
async fn list_workers(&mut self) -> Result<Vec<ExposedWorker>, JobError>;
async fn counts(&mut self) -> Result<JobStateCount, JobError> {
Ok(JobStateCount::default())
}
async fn list_jobs(
&mut self,
status: &JobState,
page: i32,
) -> Result<Vec<JobRequest<Job>>, JobError>;
}