use serde::Serialize;
use validator::Validate;
use super::super::traits::*;
#[derive(Debug, Clone, Serialize, Validate)]
pub struct ImageGenBody<N>
where
N: ModelName + ImageGen + Serialize,
{
pub model: N,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 1, max = 4000))]
pub prompt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<ImageQuality>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<ImageSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub watermark_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[validate(length(min = 6, max = 128))]
pub user_id: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub enum ImageQuality {
#[serde(rename = "hd")]
Hd,
#[serde(rename = "standard")]
Standard,
}
#[derive(Debug, Clone)]
pub enum ImageSize {
Size1024x1024,
Size768x1344,
Size864x1152,
Size1344x768,
Size1152x864,
Size1440x720,
Size720x1440,
Custom { width: u32, height: u32 },
}
impl serde::Serialize for ImageSize {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let s = match self {
ImageSize::Size1024x1024 => "1024x1024".to_string(),
ImageSize::Size768x1344 => "768x1344".to_string(),
ImageSize::Size864x1152 => "864x1152".to_string(),
ImageSize::Size1344x768 => "1344x768".to_string(),
ImageSize::Size1152x864 => "1152x864".to_string(),
ImageSize::Size1440x720 => "1440x720".to_string(),
ImageSize::Size720x1440 => "720x1440".to_string(),
ImageSize::Custom { width, height } => format!("{}x{}", width, height),
};
serializer.serialize_str(&s)
}
}
impl ImageSize {
pub fn is_valid(&self) -> bool {
match self {
ImageSize::Custom { width, height } => {
if *width < 512 || *width > 2048 || *height < 512 || *height > 2048 {
return false;
}
if width % 16 != 0 || height % 16 != 0 {
return false;
}
let total_pixels = (*width as u64) * (*height as u64);
total_pixels <= 2_097_152
},
_ => true, }
}
pub fn dimensions(&self) -> (u32, u32) {
match self {
ImageSize::Size1024x1024 => (1024, 1024),
ImageSize::Size768x1344 => (768, 1344),
ImageSize::Size864x1152 => (864, 1152),
ImageSize::Size1344x768 => (1344, 768),
ImageSize::Size1152x864 => (1152, 864),
ImageSize::Size1440x720 => (1440, 720),
ImageSize::Size720x1440 => (720, 1440),
ImageSize::Custom { width, height } => (*width, *height),
}
}
}