use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::{BridgeError, ImageRequest, ImageResponse};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ImageJobStatus {
Queued,
Running,
Succeeded,
Failed,
Cancelled,
Interrupted,
}
impl ImageJobStatus {
#[must_use]
pub const fn terminal(self) -> bool {
matches!(
self,
Self::Succeeded | Self::Failed | Self::Cancelled | Self::Interrupted
)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ImageJobProgress {
pub stage: String,
pub partial_images: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ImageJobSummary {
pub id: String,
pub status: ImageJobStatus,
pub created: u64,
pub updated: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub started: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub progress: Option<ImageJobProgress>,
pub favorite: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ImageJob {
#[serde(flatten)]
pub summary: ImageJobSummary,
pub request: ImageRequest,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<ImageResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<BridgeError>,
pub cancel_requested: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ImageJobPage {
pub items: Vec<ImageJobSummary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_cursor: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ImageJobUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub favorite: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted: Option<bool>,
}