qiniu_objects_manager/
objects_manager.rs1use super::Bucket;
2use assert_impl::assert_impl;
3use qiniu_apis::{
4 credential::CredentialProvider,
5 http_client::{
6 BucketName, BucketRegionsQueryer, BucketRegionsQueryerBuilder, Endpoints, HttpClient, RegionsProvider,
7 },
8 Client as QiniuApiClient,
9};
10use std::sync::Arc;
11
12#[derive(Debug, Clone)]
14pub struct ObjectsManager(Arc<ObjectsManagerInner>);
15
16#[derive(Debug)]
17struct ObjectsManagerInner {
18 client: QiniuApiClient,
19 credential: Arc<dyn CredentialProvider>,
20 queryer: BucketRegionsQueryer,
21}
22
23impl ObjectsManager {
24 #[inline]
28 pub fn builder(credential: impl CredentialProvider + 'static) -> ObjectsManagerBuilder {
29 ObjectsManagerBuilder::new(credential)
30 }
31
32 #[inline]
36 pub fn new(credential: impl CredentialProvider + 'static) -> Self {
37 Self::builder(credential).build()
38 }
39
40 #[inline]
42 pub fn client(&self) -> &QiniuApiClient {
43 &self.0.client
44 }
45
46 #[inline]
48 pub fn credential(&self) -> &dyn CredentialProvider {
49 &self.0.credential
50 }
51
52 #[inline]
54 pub fn queryer(&self) -> &BucketRegionsQueryer {
55 &self.0.queryer
56 }
57
58 #[inline]
60 pub fn bucket(&self, name: impl Into<BucketName>) -> Bucket {
61 self._bucket_with_region(name.into(), None)
62 }
63
64 #[inline]
68 pub fn bucket_with_region(
69 &self,
70 name: impl Into<BucketName>,
71 region_provider: impl RegionsProvider + 'static,
72 ) -> Bucket {
73 self._bucket_with_region(name.into(), Some(Box::new(region_provider)))
74 }
75
76 fn _bucket_with_region(&self, name: BucketName, region_provider: Option<Box<dyn RegionsProvider>>) -> Bucket {
77 Bucket::new(name, self.to_owned(), region_provider)
78 }
79
80 #[allow(dead_code)]
81 fn assert() {
82 assert_impl!(Send: Self);
83 assert_impl!(Sync: Self);
84 }
85}
86
87#[derive(Debug, Clone)]
89pub struct ObjectsManagerBuilder {
90 api_client: Option<QiniuApiClient>,
91 http_client: Option<HttpClient>,
92 credential: Arc<dyn CredentialProvider>,
93 queryer_builder: Option<BucketRegionsQueryerBuilder>,
94 queryer: Option<BucketRegionsQueryer>,
95}
96
97impl ObjectsManagerBuilder {
98 #[inline]
100 pub fn new(credential: impl CredentialProvider + 'static) -> Self {
101 Self {
102 credential: Arc::new(credential),
103 api_client: Default::default(),
104 http_client: Default::default(),
105 queryer_builder: Default::default(),
106 queryer: Default::default(),
107 }
108 }
109
110 #[inline]
112 pub fn api_client(&mut self, api_client: QiniuApiClient) -> &mut Self {
113 self.api_client = Some(api_client);
114 self
115 }
116
117 pub fn http_client(&mut self, http_client: HttpClient) -> &mut Self {
119 self.http_client = Some(http_client.to_owned());
120 self.with_queryer_builder(|queryer_builder| {
121 queryer_builder.http_client(http_client);
122 })
123 }
124
125 pub fn use_https(&mut self, use_https: bool) -> &mut Self {
129 self.http_client(HttpClient::build_default().use_https(use_https).build())
130 .with_queryer_builder(|queryer_builder| {
131 queryer_builder.use_https(use_https);
132 })
133 }
134
135 #[inline]
137 pub fn queryer(&mut self, queryer: BucketRegionsQueryer) -> &mut Self {
138 self.queryer = Some(queryer);
139 self
140 }
141
142 pub fn uc_endpoints(&mut self, endpoints: impl Into<Endpoints>) -> &mut Self {
144 self.with_queryer_builder(|queryer_builder| {
145 queryer_builder.uc_endpoints(endpoints);
146 })
147 }
148
149 fn with_queryer_builder(&mut self, f: impl FnOnce(&mut BucketRegionsQueryerBuilder)) -> &mut Self {
150 if let Some(queryer_builder) = self.queryer_builder.as_mut() {
151 f(queryer_builder);
152 } else {
153 let mut queryer_builder = BucketRegionsQueryer::builder();
154 f(&mut queryer_builder);
155 self.queryer_builder = Some(queryer_builder);
156 }
157 self
158 }
159
160 pub fn build(&mut self) -> ObjectsManager {
162 let api_client = self.api_client.take();
163 let http_client = self.http_client.take();
164 let queryer = self.queryer.take();
165 let mut queryer_builder = self.queryer_builder.take();
166
167 ObjectsManager(Arc::new(ObjectsManagerInner {
168 client: api_client
169 .or_else(|| http_client.map(QiniuApiClient::new))
170 .unwrap_or_default(),
171 credential: self.credential.to_owned(),
172 queryer: queryer
173 .or_else(|| queryer_builder.as_mut().map(|builder| builder.build()))
174 .unwrap_or_default(),
175 }))
176 }
177
178 #[allow(dead_code)]
179 fn assert() {
180 assert_impl!(Send: Self);
181 assert_impl!(Sync: Self);
182 }
183}