Skip to main content

ferrin_spec/dynamic/
files.rs

1//! Object-safe files service.
2
3use super::BoxFuture;
4use super::ServiceRef;
5use super::model_ref::ref_conversions;
6use crate::error::ProviderError;
7use crate::files::DeleteFileResult;
8use crate::files::DownloadFileResult;
9use crate::files::FileMetadataResult;
10use crate::files::FileReferenceOptions;
11use crate::files::Files;
12use crate::files::UploadFileOptions;
13use crate::files::UploadFileResult;
14use crate::shared::ProviderId;
15
16/// Object-safe counterpart of [`Files`].
17pub trait DynFiles: Send + Sync + 'static {
18    /// See [`Files::provider`].
19    fn provider(&self) -> &ProviderId;
20    /// See [`Files::upload_file`].
21    fn upload_file(
22        &self,
23        options: UploadFileOptions,
24    ) -> BoxFuture<'_, Result<UploadFileResult, ProviderError>>;
25    /// See [`Files::supports_get_file_metadata`].
26    fn supports_get_file_metadata(&self) -> bool;
27    /// See [`Files::get_file_metadata`].
28    fn get_file_metadata(
29        &self,
30        options: FileReferenceOptions,
31    ) -> BoxFuture<'_, Result<FileMetadataResult, ProviderError>>;
32    /// See [`Files::supports_download_file`].
33    fn supports_download_file(&self) -> bool;
34    /// See [`Files::download_file`].
35    fn download_file(
36        &self,
37        options: FileReferenceOptions,
38    ) -> BoxFuture<'_, Result<DownloadFileResult, ProviderError>>;
39    /// See [`Files::supports_delete_file`].
40    fn supports_delete_file(&self) -> bool;
41    /// See [`Files::delete_file`].
42    fn delete_file(
43        &self,
44        options: FileReferenceOptions,
45    ) -> BoxFuture<'_, Result<DeleteFileResult, ProviderError>>;
46}
47
48impl<T: Files> DynFiles for T {
49    fn provider(&self) -> &ProviderId {
50        Files::provider(self)
51    }
52
53    fn upload_file(
54        &self,
55        options: UploadFileOptions,
56    ) -> BoxFuture<'_, Result<UploadFileResult, ProviderError>> {
57        Box::pin(Files::upload_file(self, options))
58    }
59
60    fn supports_get_file_metadata(&self) -> bool {
61        Files::supports_get_file_metadata(self)
62    }
63
64    fn get_file_metadata(
65        &self,
66        options: FileReferenceOptions,
67    ) -> BoxFuture<'_, Result<FileMetadataResult, ProviderError>> {
68        Box::pin(Files::get_file_metadata(self, options))
69    }
70
71    fn supports_download_file(&self) -> bool {
72        Files::supports_download_file(self)
73    }
74
75    fn download_file(
76        &self,
77        options: FileReferenceOptions,
78    ) -> BoxFuture<'_, Result<DownloadFileResult, ProviderError>> {
79        Box::pin(Files::download_file(self, options))
80    }
81
82    fn supports_delete_file(&self) -> bool {
83        Files::supports_delete_file(self)
84    }
85
86    fn delete_file(
87        &self,
88        options: FileReferenceOptions,
89    ) -> BoxFuture<'_, Result<DeleteFileResult, ProviderError>> {
90        Box::pin(Files::delete_file(self, options))
91    }
92}
93
94/// Shared reference to a files service.
95pub type FilesRef = ServiceRef<dyn DynFiles>;
96
97ref_conversions!(FilesRef, Files, DynFiles);