Skip to main content

ferrin_spec/dynamic/
image_model.rs

1//! Object-safe image model.
2
3use super::BoxFuture;
4use super::ModelRef;
5use super::model_ref::ref_conversions;
6use crate::error::ProviderError;
7use crate::image_model::ImageModel;
8use crate::image_model::ImageOptions;
9use crate::image_model::ImageResult;
10use crate::shared::ModelId;
11use crate::shared::ProviderId;
12
13/// Object-safe counterpart of [`ImageModel`].
14pub trait DynImageModel: Send + Sync + 'static {
15    /// See [`ImageModel::provider`].
16    fn provider(&self) -> &ProviderId;
17    /// See [`ImageModel::model_id`].
18    fn model_id(&self) -> &ModelId;
19    /// See [`ImageModel::max_images_per_call`].
20    fn max_images_per_call(&self) -> Option<usize>;
21    /// See [`ImageModel::do_generate`].
22    fn do_generate(
23        &self,
24        options: ImageOptions,
25    ) -> BoxFuture<'_, Result<ImageResult, ProviderError>>;
26}
27
28impl<T: ImageModel> DynImageModel for T {
29    fn provider(&self) -> &ProviderId {
30        ImageModel::provider(self)
31    }
32
33    fn model_id(&self) -> &ModelId {
34        ImageModel::model_id(self)
35    }
36
37    fn max_images_per_call(&self) -> Option<usize> {
38        ImageModel::max_images_per_call(self)
39    }
40
41    fn do_generate(
42        &self,
43        options: ImageOptions,
44    ) -> BoxFuture<'_, Result<ImageResult, ProviderError>> {
45        Box::pin(ImageModel::do_generate(self, options))
46    }
47}
48
49/// Shared reference to an image model (or an unresolved model id).
50pub type ImageModelRef = ModelRef<dyn DynImageModel>;
51
52ref_conversions!(ImageModelRef, ImageModel, DynImageModel);