qiniu_objects_manager/
objects_manager.rs

1use 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/// 七牛对象管理器
13#[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    /// 创建七牛对象管理构建器
25    ///
26    /// 必须传入认证信息提供者
27    #[inline]
28    pub fn builder(credential: impl CredentialProvider + 'static) -> ObjectsManagerBuilder {
29        ObjectsManagerBuilder::new(credential)
30    }
31
32    /// 创建七牛对象管理器
33    ///
34    /// 必须传入认证信息提供者
35    #[inline]
36    pub fn new(credential: impl CredentialProvider + 'static) -> Self {
37        Self::builder(credential).build()
38    }
39
40    /// 获取七牛 API 调用客户端
41    #[inline]
42    pub fn client(&self) -> &QiniuApiClient {
43        &self.0.client
44    }
45
46    /// 获取七牛认证信息提供者
47    #[inline]
48    pub fn credential(&self) -> &dyn CredentialProvider {
49        &self.0.credential
50    }
51
52    /// 获取七牛存储空间相关区域查询器
53    #[inline]
54    pub fn queryer(&self) -> &BucketRegionsQueryer {
55        &self.0.queryer
56    }
57
58    /// 获取七牛存储空间管理器
59    #[inline]
60    pub fn bucket(&self, name: impl Into<BucketName>) -> Bucket {
61        self._bucket_with_region(name.into(), None)
62    }
63
64    /// 获取七牛存储空间管理器
65    ///
66    /// 可以提供区域信息提供者
67    #[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/// 七牛对象管理构建器
88#[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    /// 创建七牛对象管理构建器
99    #[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    /// 设置七牛 API 调用客户端
111    #[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    /// 设置 HTTP 客户端
118    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    /// 是否启用 HTTPS 协议
126    ///
127    /// 默认为 HTTPS 协议
128    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    /// 设置存储空间相关区域查询器
136    #[inline]
137    pub fn queryer(&mut self, queryer: BucketRegionsQueryer) -> &mut Self {
138        self.queryer = Some(queryer);
139        self
140    }
141
142    /// 设置存储空间管理终端地址
143    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    /// 构建七牛对象管理器
161    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}