Skip to main content

ferrin_spec/dynamic/
video_model.rs

1//! Object-safe video model.
2
3use super::BoxFuture;
4use super::ModelRef;
5use super::model_ref::ref_conversions;
6use crate::error::ProviderError;
7use crate::shared::ModelId;
8use crate::shared::ProviderId;
9use crate::video_model::VideoModel;
10use crate::video_model::VideoOptions;
11use crate::video_model::VideoResult;
12use crate::video_model::VideoStartOptions;
13use crate::video_model::VideoStartResult;
14use crate::video_model::VideoStatusOptions;
15use crate::video_model::VideoStatusResult;
16use crate::video_model::WebhookFactory;
17use crate::video_model::WebhookHandle;
18
19/// Object-safe counterpart of [`VideoModel`].
20pub trait DynVideoModel: Send + Sync + 'static {
21    /// See [`VideoModel::provider`].
22    fn provider(&self) -> &ProviderId;
23    /// See [`VideoModel::model_id`].
24    fn model_id(&self) -> &ModelId;
25    /// See [`VideoModel::max_videos_per_call`].
26    fn max_videos_per_call(&self) -> Option<usize>;
27    /// See [`VideoModel::supports_generate`].
28    fn supports_generate(&self) -> bool;
29    /// See [`VideoModel::do_generate`].
30    fn do_generate(
31        &self,
32        options: VideoOptions,
33    ) -> BoxFuture<'_, Result<VideoResult, ProviderError>>;
34    /// See [`VideoModel::supports_operations`].
35    fn supports_operations(&self) -> bool;
36    /// See [`VideoModel::do_start`].
37    fn do_start(
38        &self,
39        options: VideoStartOptions,
40    ) -> BoxFuture<'_, Result<VideoStartResult, ProviderError>>;
41    /// See [`VideoModel::do_status`].
42    fn do_status(
43        &self,
44        options: VideoStatusOptions,
45    ) -> BoxFuture<'_, Result<VideoStatusResult, ProviderError>>;
46    /// See [`VideoModel::supports_webhook`].
47    fn supports_webhook(&self) -> bool;
48    /// See [`VideoModel::handle_webhook`].
49    fn handle_webhook(
50        &self,
51        factory: WebhookFactory,
52    ) -> BoxFuture<'_, Result<WebhookHandle, ProviderError>>;
53}
54
55impl<T: VideoModel> DynVideoModel for T {
56    fn provider(&self) -> &ProviderId {
57        VideoModel::provider(self)
58    }
59
60    fn model_id(&self) -> &ModelId {
61        VideoModel::model_id(self)
62    }
63
64    fn max_videos_per_call(&self) -> Option<usize> {
65        VideoModel::max_videos_per_call(self)
66    }
67
68    fn supports_generate(&self) -> bool {
69        VideoModel::supports_generate(self)
70    }
71
72    fn do_generate(
73        &self,
74        options: VideoOptions,
75    ) -> BoxFuture<'_, Result<VideoResult, ProviderError>> {
76        Box::pin(VideoModel::do_generate(self, options))
77    }
78
79    fn supports_operations(&self) -> bool {
80        VideoModel::supports_operations(self)
81    }
82
83    fn do_start(
84        &self,
85        options: VideoStartOptions,
86    ) -> BoxFuture<'_, Result<VideoStartResult, ProviderError>> {
87        Box::pin(VideoModel::do_start(self, options))
88    }
89
90    fn do_status(
91        &self,
92        options: VideoStatusOptions,
93    ) -> BoxFuture<'_, Result<VideoStatusResult, ProviderError>> {
94        Box::pin(VideoModel::do_status(self, options))
95    }
96
97    fn supports_webhook(&self) -> bool {
98        VideoModel::supports_webhook(self)
99    }
100
101    fn handle_webhook(
102        &self,
103        factory: WebhookFactory,
104    ) -> BoxFuture<'_, Result<WebhookHandle, ProviderError>> {
105        Box::pin(VideoModel::handle_webhook(self, factory))
106    }
107}
108
109/// Shared reference to a video model (or an unresolved model id).
110pub type VideoModelRef = ModelRef<dyn DynVideoModel>;
111
112ref_conversions!(VideoModelRef, VideoModel, DynVideoModel);