use crate::shared::FileUpload;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fmt::Display;
#[derive(Serialize, Deserialize, Debug, Default, Builder, Clone, PartialEq)]
#[builder(name = "CreateImageParametersBuilder")]
#[builder(setter(into, strip_option), default)]
pub struct CreateImageParameters {
pub prompt: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<BackgroundStyle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moderation: Option<ModerationLevel>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_compression: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<OutputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub partial_images: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<ImageQuality>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<ResponseFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<ImageSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<ImageStyle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub safety_identifier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
pub ext: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Builder, Clone, PartialEq)]
#[builder(name = "EditImageParametersBuilder")]
#[builder(setter(into, strip_option), default)]
pub struct EditImageParameters {
pub image: String,
pub prompt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<BackgroundStyle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_fidelity: Option<InputFidelity>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mask: Option<FileUpload>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<MimeType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_compression: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<OutputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub partial_images: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<ImageQuality>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<ResponseFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<ImageSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Default, Builder, Clone, PartialEq)]
#[builder(name = "CreateImageVariationParametersBuilder")]
#[builder(setter(into, strip_option), default)]
pub struct CreateImageVariationParameters {
pub image: FileUpload,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<ResponseFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<ImageSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Default, Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ImageResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<BackgroundStyle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<u32>,
pub data: Vec<ImageData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<OutputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<ImageQuality>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<ImageSizeResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<ImageUsage>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub enum ImageSize {
#[serde(rename = "256x256")]
Size256X256,
#[serde(rename = "512x512")]
Size512X512,
#[serde(rename = "1024x1024")]
Size1024X1024,
#[serde(rename = "1024x1536")]
Size1024X1536,
#[serde(rename = "1536x1024")]
Size1536X1024,
#[serde(rename = "1792x1024")]
Size1792X1024,
#[serde(rename = "1024x1792")]
Size1024X1792,
#[serde(rename = "auto")]
Auto,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub enum ImageSizeResponse {
#[serde(rename = "256x256")]
Size256X256,
#[serde(rename = "512x512")]
Size512X512,
#[serde(rename = "1024x1024")]
Size1024X1024,
#[serde(rename = "1024x1536")]
Size1024X1536,
#[serde(rename = "1536x1024")]
Size1536X1024,
#[serde(rename = "1792x1024")]
Size1792X1024,
#[serde(rename = "1024x1792")]
Size1024X1792,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum BackgroundStyle {
Transparent,
Opaque,
Auto,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ImageQuality {
Standard,
Hd,
High,
Medium,
Low,
Auto,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum MimeType {
#[serde(rename = "image/png")]
Png,
#[serde(rename = "image/jpeg")]
Jpeg,
#[serde(rename = "image/webp")]
Webp,
#[serde(rename = "application/octet-stream")]
OctetStream,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ImageStyle {
Vivid,
Natural,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ModerationLevel {
Auto,
Low,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum OutputFormat {
Png,
Jpeg,
Webp,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum InputFidelity {
High,
Low,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ResponseFormat {
Url,
B64Json,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ImageUsage {
#[serde(default = "zero")]
pub input_tokens: u32,
pub input_tokens_details: Option<InputTokensDetails>,
#[serde(default = "zero")]
pub output_tokens: u32,
#[serde(default = "zero")]
pub total_tokens: u32,
}
fn zero() -> u32 {
0
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct InputTokensDetails {
pub image_tokens: u32,
pub text_tokens: u32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum ImageData {
Url {
url: String,
#[serde(skip_serializing_if = "Option::is_none")]
revised_prompt: Option<String>,
},
B64Json {
b64_json: String,
#[serde(skip_serializing_if = "Option::is_none")]
revised_prompt: Option<String>,
},
}
impl Display for InputFidelity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
InputFidelity::High => "high",
InputFidelity::Low => "low",
}
)
}
}
impl Display for OutputFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
OutputFormat::Png => "png",
OutputFormat::Jpeg => "jpeg",
OutputFormat::Webp => "webp",
}
)
}
}
impl Display for BackgroundStyle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
BackgroundStyle::Transparent => "transparent",
BackgroundStyle::Opaque => "opaque",
BackgroundStyle::Auto => "auto",
}
)
}
}
impl Display for ImageQuality {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
ImageQuality::Standard => "standard",
ImageQuality::Hd => "hd",
ImageQuality::High => "high",
ImageQuality::Medium => "medium",
ImageQuality::Low => "low",
ImageQuality::Auto => "auto",
}
)
}
}
impl Display for ImageSize {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
ImageSize::Size256X256 => "256x256",
ImageSize::Size512X512 => "512x512",
ImageSize::Size1024X1024 => "1024x1024",
ImageSize::Size1536X1024 => "1536x1024",
ImageSize::Size1024X1536 => "1024x1536",
ImageSize::Size1792X1024 => "1792x1024",
ImageSize::Size1024X1792 => "1024x1792",
ImageSize::Auto => "auto",
}
)
}
}
impl Display for MimeType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
MimeType::Png => "image/png",
MimeType::Jpeg => "image/jpeg",
MimeType::Webp => "image/webp",
MimeType::OctetStream => "application/octet-stream",
}
)
}
}
impl Display for ResponseFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
ResponseFormat::Url => "url",
ResponseFormat::B64Json => "b64_json",
}
)
}
}