qiniu_upload_manager/
upload_manager.rs1use super::{
2 upload_token::UploadTokenSigner, AutoUploader, AutoUploaderBuilder, FormUploader, MultiPartsUploader,
3 MultiPartsV1Uploader, MultiPartsV2Uploader, ResumableRecorder, SinglePartUploader,
4};
5use assert_impl::assert_impl;
6use digest::Digest;
7use qiniu_apis::{
8 http_client::{BucketRegionsQueryer, BucketRegionsQueryerBuilder, Endpoints, HttpClient},
9 Client as QiniuApiClient,
10};
11use std::sync::Arc;
12
13#[derive(Debug, Clone)]
15pub struct UploadManager(Arc<UploadManagerInner>);
16
17#[derive(Debug)]
18struct UploadManagerInner {
19 upload_token_signer: UploadTokenSigner,
20 client: QiniuApiClient,
21 queryer: BucketRegionsQueryer,
22}
23
24impl UploadManager {
25 #[inline]
27 pub fn builder(upload_token: impl Into<UploadTokenSigner>) -> UploadManagerBuilder {
28 UploadManagerBuilder::new(upload_token)
29 }
30
31 #[inline]
33 pub fn new(upload_token: impl Into<UploadTokenSigner>) -> Self {
34 Self::builder(upload_token).build()
35 }
36
37 #[inline]
39 pub fn upload_token(&self) -> &UploadTokenSigner {
40 &self.0.upload_token_signer
41 }
42
43 #[inline]
45 pub fn client(&self) -> &QiniuApiClient {
46 &self.0.client
47 }
48
49 #[inline]
51 pub fn queryer(&self) -> &BucketRegionsQueryer {
52 &self.0.queryer
53 }
54
55 #[inline]
57 pub fn single_part_uploader(&self) -> impl SinglePartUploader {
58 self.form_uploader()
59 }
60
61 #[inline]
63 pub fn form_uploader(&self) -> FormUploader {
64 FormUploader::new(self.to_owned())
65 }
66
67 #[inline]
69 pub fn multi_parts_uploader<H: Digest + Send + 'static, R: ResumableRecorder<HashAlgorithm = H> + 'static>(
70 &self,
71 resumable_recorder: R,
72 ) -> impl MultiPartsUploader<HashAlgorithm = H> {
73 self.multi_parts_v2_uploader(resumable_recorder)
74 }
75
76 #[inline]
78 pub fn multi_parts_v1_uploader<H: Digest + Send + 'static, R: ResumableRecorder<HashAlgorithm = H> + 'static>(
79 &self,
80 resumable_recorder: R,
81 ) -> MultiPartsV1Uploader<H> {
82 MultiPartsV1Uploader::<H>::new(self.to_owned(), resumable_recorder)
83 }
84
85 #[inline]
87 pub fn multi_parts_v2_uploader<H: Digest + Send + 'static, R: ResumableRecorder<HashAlgorithm = H> + 'static>(
88 &self,
89 resumable_recorder: R,
90 ) -> MultiPartsV2Uploader<H> {
91 MultiPartsV2Uploader::<H>::new(self.to_owned(), resumable_recorder)
92 }
93
94 #[inline]
96 pub fn auto_uploader<H: Digest + Send + 'static>(&self) -> AutoUploader<H> {
97 AutoUploader::<H>::new(self.to_owned())
98 }
99
100 #[inline]
102 pub fn auto_uploader_builder<H: Digest + Send + 'static>(&self) -> AutoUploaderBuilder<H> {
103 AutoUploader::<H>::builder(self.to_owned())
104 }
105
106 #[allow(dead_code)]
107 fn assert() {
108 assert_impl!(Send: Self);
109 assert_impl!(Sync: Self);
110 }
111}
112
113#[derive(Debug)]
115pub struct UploadManagerBuilder {
116 api_client: Option<QiniuApiClient>,
117 http_client: Option<HttpClient>,
118 queryer_builder: Option<BucketRegionsQueryerBuilder>,
119 queryer: Option<BucketRegionsQueryer>,
120 upload_token_signer: UploadTokenSigner,
121}
122
123impl UploadManagerBuilder {
124 #[inline]
126 pub fn new(upload_token_signer: impl Into<UploadTokenSigner>) -> Self {
127 Self {
128 upload_token_signer: upload_token_signer.into(),
129 api_client: Default::default(),
130 http_client: Default::default(),
131 queryer_builder: Default::default(),
132 queryer: Default::default(),
133 }
134 }
135
136 #[inline]
138 pub fn api_client(&mut self, api_client: QiniuApiClient) -> &mut Self {
139 self.api_client = Some(api_client);
140 self
141 }
142
143 pub fn http_client(&mut self, http_client: HttpClient) -> &mut Self {
145 self.http_client = Some(http_client.to_owned());
146 self.with_queryer_builder(|queryer_builder| {
147 queryer_builder.http_client(http_client);
148 })
149 }
150
151 pub fn use_https(&mut self, use_https: bool) -> &mut Self {
155 self.http_client(HttpClient::build_default().use_https(use_https).build())
156 .with_queryer_builder(|queryer_builder| {
157 queryer_builder.use_https(use_https);
158 })
159 }
160
161 #[inline]
163 pub fn queryer(&mut self, queryer: BucketRegionsQueryer) -> &mut Self {
164 self.queryer = Some(queryer);
165 self
166 }
167
168 pub fn uc_endpoints(&mut self, endpoints: impl Into<Endpoints>) -> &mut Self {
170 self.with_queryer_builder(|queryer_builder| {
171 queryer_builder.uc_endpoints(endpoints);
172 })
173 }
174
175 fn with_queryer_builder(&mut self, f: impl FnOnce(&mut BucketRegionsQueryerBuilder)) -> &mut Self {
176 if let Some(queryer_builder) = self.queryer_builder.as_mut() {
177 f(queryer_builder);
178 } else {
179 let mut queryer_builder = BucketRegionsQueryer::builder();
180 f(&mut queryer_builder);
181 self.queryer_builder = Some(queryer_builder);
182 }
183 self
184 }
185
186 pub fn build(&mut self) -> UploadManager {
188 let upload_token_provider = self.upload_token_signer.to_owned();
189 let api_client = self.api_client.take();
190 let http_client = self.http_client.take();
191 let queryer = self.queryer.take();
192 let mut queryer_builder = self.queryer_builder.take();
193 UploadManager(Arc::new(UploadManagerInner {
194 upload_token_signer: upload_token_provider,
195 client: api_client
196 .or_else(|| http_client.map(QiniuApiClient::new))
197 .unwrap_or_default(),
198 queryer: queryer
199 .or_else(|| queryer_builder.as_mut().map(|builder| builder.build()))
200 .unwrap_or_default(),
201 }))
202 }
203
204 #[allow(dead_code)]
205 fn assert() {
206 assert_impl!(Send: Self);
207 assert_impl!(Sync: Self);
208 }
209}