use serde::{Deserialize, Serialize};
use crate::types::chat::BuildError;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ImageGenerationRequest {
pub model: String,
pub prompt: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<String>,
}
impl ImageGenerationRequest {
pub fn builder() -> ImageGenerationRequestBuilder {
ImageGenerationRequestBuilder::default()
}
}
#[derive(Debug, Clone, Default)]
pub struct ImageGenerationRequestBuilder {
model: Option<String>,
prompt: Option<String>,
n: Option<u32>,
size: Option<String>,
quality: Option<String>,
background: Option<String>,
}
impl ImageGenerationRequestBuilder {
pub fn model(mut self, model: impl Into<String>) -> Self {
self.model = Some(model.into());
self
}
pub fn prompt(mut self, prompt: impl Into<String>) -> Self {
self.prompt = Some(prompt.into());
self
}
pub fn n(mut self, n: u32) -> Self {
self.n = Some(n);
self
}
pub fn size(mut self, size: impl Into<String>) -> Self {
self.size = Some(size.into());
self
}
pub fn quality(mut self, quality: impl Into<String>) -> Self {
self.quality = Some(quality.into());
self
}
pub fn background(mut self, background: impl Into<String>) -> Self {
self.background = Some(background.into());
self
}
pub fn build(self) -> Result<ImageGenerationRequest, BuildError> {
let model = self.model.ok_or(BuildError::MissingModel)?;
let prompt = self.prompt.ok_or(BuildError::MissingPrompt)?;
Ok(ImageGenerationRequest {
model,
prompt,
n: self.n,
size: self.size,
quality: self.quality,
background: self.background,
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ImageGenerationResponse {
pub created: u64,
pub data: Vec<GeneratedImage>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GeneratedImage {
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub b64_json: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub revised_prompt: Option<String>,
}