use super::BoxFuture;
use super::ModelRef;
use super::model_ref::ref_conversions;
use crate::error::ProviderError;
use crate::image_model::ImageModel;
use crate::image_model::ImageOptions;
use crate::image_model::ImageResult;
use crate::shared::ModelId;
use crate::shared::ProviderId;
pub trait DynImageModel: Send + Sync + 'static {
fn provider(&self) -> &ProviderId;
fn model_id(&self) -> &ModelId;
fn max_images_per_call(&self) -> Option<usize>;
fn do_generate(
&self,
options: ImageOptions,
) -> BoxFuture<'_, Result<ImageResult, ProviderError>>;
}
impl<T: ImageModel> DynImageModel for T {
fn provider(&self) -> &ProviderId {
ImageModel::provider(self)
}
fn model_id(&self) -> &ModelId {
ImageModel::model_id(self)
}
fn max_images_per_call(&self) -> Option<usize> {
ImageModel::max_images_per_call(self)
}
fn do_generate(
&self,
options: ImageOptions,
) -> BoxFuture<'_, Result<ImageResult, ProviderError>> {
Box::pin(ImageModel::do_generate(self, options))
}
}
pub type ImageModelRef = ModelRef<dyn DynImageModel>;
ref_conversions!(ImageModelRef, ImageModel, DynImageModel);