gproxy_protocol/openai/images/stream/
edit.rs1use serde::{Deserialize, Serialize, de};
2use serde_json::Value;
3
4use crate::openai::common::{ImageStreamEventType, ImageStreamEventTypeKnown};
5
6use super::{
7 ImageCompletedEvent, ImagePartialEvent, UnknownImageStreamEvent, image_stream_event_type,
8};
9
10#[derive(Debug, Clone, PartialEq, Serialize)]
11#[serde(untagged)]
12#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
13pub enum ImageEditStreamEvent {
14 Known(KnownImageEditStreamEvent),
15 Unknown(UnknownImageStreamEvent),
16}
17
18impl<'de> Deserialize<'de> for ImageEditStreamEvent {
19 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
20 let value = Value::deserialize(deserializer)?;
21 match image_stream_event_type::<D::Error>(&value)? {
22 Some(ImageStreamEventType::Known(
23 ImageStreamEventTypeKnown::ImageEditPartialImage
24 | ImageStreamEventTypeKnown::ImageEditCompleted,
25 )) => serde_json::from_value(value)
26 .map(Self::Known)
27 .map_err(de::Error::custom),
28 Some(ImageStreamEventType::Known(_)) => Err(de::Error::custom(
29 "known image generation event cannot deserialize as an image edit event",
30 )),
31 Some(ImageStreamEventType::Unknown(_)) | None => serde_json::from_value(value)
32 .map(Self::Unknown)
33 .map_err(de::Error::custom),
34 }
35 }
36}
37
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
39#[serde(tag = "type")]
40#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
41pub enum KnownImageEditStreamEvent {
42 #[serde(rename = "image_edit.partial_image")]
43 PartialImage(ImagePartialEvent),
44 #[serde(rename = "image_edit.completed")]
45 Completed(ImageCompletedEvent),
46}