use serde::{Deserialize, Serialize};
#[cfg(feature = "strum")]
use strum::{Display, EnumString};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "strum", derive(Display, EnumString))]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[cfg_attr(feature = "strum", strum(serialize_all = "SCREAMING_SNAKE_CASE"))]
pub enum JobStatus {
InQueue,
InProgress,
Completed,
Failed,
TimedOut,
Cancelled,
}
impl JobStatus {
pub fn is_final(&self) -> bool {
matches!(
self,
JobStatus::Completed | JobStatus::Failed | JobStatus::TimedOut | JobStatus::Cancelled
)
}
pub fn is_completed(&self) -> bool {
matches!(self, JobStatus::Completed)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JobStatusResponse {
pub status: JobStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StreamResponse {
pub status: JobStatus,
#[serde(default)]
pub stream: Vec<StreamChunk>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StreamChunk {
pub output: serde_json::Value,
}
pub type JobOutput = serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EndpointHealth {
pub jobs: JobStats,
pub workers: WorkerStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JobStats {
pub completed: u32,
pub failed: u32,
pub in_progress: u32,
pub in_queue: u32,
pub retried: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkerStats {
pub idle: u32,
pub initializing: u32,
pub ready: u32,
pub running: u32,
pub throttled: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunRequest {
pub input: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunResponse {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<JobStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<serde_json::Value>,
}