use serde::{Deserialize, Serialize};
use crate::openai::create_image::types::{
OpenAiApiError, OpenAiImageBackground, OpenAiImageOutputFormat, OpenAiImageUsage,
};
use crate::openai::create_image_edit::types::{OpenAiImageEditQuality, OpenAiImageEditSize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OpenAiCreateImageEditSseStreamBody {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub events: Vec<OpenAiCreateImageEditSseEvent>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OpenAiCreateImageEditSseEvent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub event: Option<String>,
pub data: OpenAiCreateImageEditSseData,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OpenAiCreateImageEditSseData {
Event(ImageEditStreamEvent),
Done(String),
}
impl OpenAiCreateImageEditSseData {
pub fn is_done(&self) -> bool {
matches!(self, Self::Done(marker) if marker == "[DONE]")
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ImageEditStreamEvent {
#[serde(rename = "image_edit.partial_image")]
PartialImage {
b64_json: String,
background: OpenAiImageBackground,
created_at: u64,
output_format: OpenAiImageOutputFormat,
partial_image_index: u32,
quality: OpenAiImageEditQuality,
size: OpenAiImageEditSize,
},
#[serde(rename = "image_edit.completed")]
Completed {
b64_json: String,
background: OpenAiImageBackground,
created_at: u64,
output_format: OpenAiImageOutputFormat,
quality: OpenAiImageEditQuality,
size: OpenAiImageEditSize,
usage: OpenAiImageUsage,
},
#[serde(rename = "error")]
Error { error: OpenAiApiError },
#[serde(rename = "keepalive")]
Keepalive {
#[serde(default, skip_serializing_if = "Option::is_none")]
sequence_number: Option<u64>,
},
}