Skip to main content

gproxy_protocol/openai/images/stream/
generation.rs

1use 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 ImageGenerationStreamEvent {
14    Known(KnownImageGenerationStreamEvent),
15    Unknown(UnknownImageStreamEvent),
16}
17
18impl<'de> Deserialize<'de> for ImageGenerationStreamEvent {
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::ImageGenerationPartialImage
24                | ImageStreamEventTypeKnown::ImageGenerationCompleted,
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 edit event cannot deserialize as an image generation 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 KnownImageGenerationStreamEvent {
42    #[serde(rename = "image_generation.partial_image")]
43    PartialImage(ImagePartialEvent),
44    #[serde(rename = "image_generation.completed")]
45    Completed(ImageCompletedEvent),
46}