rig/client/
image_generation.rs1#[cfg(feature = "image")]
2mod image {
3    use crate::client::{AsImageGeneration, ProviderClient};
4    use crate::image_generation::{
5        ImageGenerationError, ImageGenerationModel, ImageGenerationModelDyn,
6        ImageGenerationRequest, ImageGenerationResponse,
7    };
8    use std::future::Future;
9    use std::sync::Arc;
10
11    pub trait ImageGenerationClient: ProviderClient + Clone {
14        type ImageGenerationModel: ImageGenerationModel;
16
17        fn image_generation_model(&self, model: &str) -> Self::ImageGenerationModel;
30    }
31
32    pub trait ImageGenerationClientDyn: ProviderClient {
33        fn image_generation_model<'a>(&self, model: &str) -> Box<dyn ImageGenerationModelDyn + 'a>;
35    }
36
37    impl<T: ImageGenerationClient<ImageGenerationModel = M>, M: ImageGenerationModel + 'static>
38        ImageGenerationClientDyn for T
39    {
40        fn image_generation_model<'a>(&self, model: &str) -> Box<dyn ImageGenerationModelDyn + 'a> {
41            Box::new(self.image_generation_model(model))
42        }
43    }
44
45    impl<T: ImageGenerationClientDyn + Clone + 'static> AsImageGeneration for T {
46        fn as_image_generation(&self) -> Option<Box<dyn ImageGenerationClientDyn>> {
47            Some(Box::new(self.clone()))
48        }
49    }
50
51    #[derive(Clone)]
53    pub struct ImageGenerationModelHandle<'a> {
54        pub(crate) inner: Arc<dyn ImageGenerationModelDyn + 'a>,
55    }
56    impl ImageGenerationModel for ImageGenerationModelHandle<'_> {
57        type Response = ();
58
59        fn image_generation(
60            &self,
61            request: ImageGenerationRequest,
62        ) -> impl Future<
63            Output = Result<ImageGenerationResponse<Self::Response>, ImageGenerationError>,
64        > + Send {
65            self.inner.image_generation(request)
66        }
67    }
68}
69
70#[cfg(feature = "image")]
71pub use image::*;