use std::sync::Arc;
use crate::error::Error;
use crate::provider::Provider;
use super::response::ImagesResponse;
#[derive(Clone)]
pub struct ImagesRequest {
pub model: String,
pub prompt: String,
pub n: Option<u32>,
pub size: Option<String>,
pub quality: Option<String>,
pub style: Option<String>,
pub provider_options: serde_json::Value,
}
impl ImagesRequest {
pub fn new(model: impl Into<String>, prompt: impl Into<String>) -> Self {
Self {
model: model.into(),
prompt: prompt.into(),
n: None,
size: None,
quality: None,
style: None,
provider_options: serde_json::Value::Null,
}
}
}
pub struct PendingImagesRequest {
provider: Arc<dyn Provider>,
request: ImagesRequest,
}
impl PendingImagesRequest {
pub fn new(
provider: Arc<dyn Provider>,
model: impl Into<String>,
prompt: impl Into<String>,
) -> Self {
Self {
provider,
request: ImagesRequest::new(model, prompt),
}
}
pub fn with_count(mut self, n: u32) -> Self {
self.request.n = Some(n);
self
}
pub fn with_size(mut self, size: impl Into<String>) -> Self {
self.request.size = Some(size.into());
self
}
pub fn with_quality(mut self, quality: impl Into<String>) -> Self {
self.request.quality = Some(quality.into());
self
}
pub fn with_style(mut self, style: impl Into<String>) -> Self {
self.request.style = Some(style.into());
self
}
pub fn to_request(&self) -> ImagesRequest {
self.request.clone()
}
pub async fn generate(self) -> Result<ImagesResponse, Error> {
self.provider.images(self.request).await
}
}