tencent_qcloud_cos_rs/bucket.rs
1//! bucket相关接口
2
3use crate::client::Client;
4
5use crate::request::{Request, Response};
6use reqwest::Body;
7
8use crate::acl::AclHeader;
9use std::collections::HashMap;
10
11#[async_trait::async_trait]
12pub trait Bucket {
13 /// 在指定账号下创建一个存储桶
14 /// 创建存储桶时,如果没有指定访问权限,则默认使用私有读写(private)权限。
15 async fn put_bucket(&self, acl_header: Option<&AclHeader>) -> Response;
16
17 /// 用于删除指定的存储桶。该 API 的请求者需要对存储桶有写入权限。
18 async fn delete_bucket(&self) -> Response;
19
20 /// 可以列出该存储桶内的部分或者全部对象。该 API 的请求者需要对存储桶有读取权限。
21 async fn list_objects(
22 &self,
23 prefix: &str,
24 delimiter: &str,
25 encoding_type: &str,
26 marker: &str,
27 max_keys: i32,
28 ) -> Response;
29
30 /// 检查bucket状态
31 async fn check_bucket(&self) -> Response;
32
33 /// 写入存储桶的访问控制列表(ACL)
34 async fn put_bucket_acl(&self, acl_header: &AclHeader) -> Response;
35}
36
37#[async_trait::async_trait]
38impl Bucket for Client {
39 /// 创建一个存储桶
40 /// 见[官网文档](https://cloud.tencent.com/document/product/436/7738)
41 /// # Examples
42 /// ```
43 /// use tencent_qcloud_cos_rs::client::Client;
44 /// use tencent_qcloud_cos_rs::bucket::Bucket;
45 /// use tencent_qcloud_cos_rs::acl::{AclHeader, BucketAcl};
46 /// async {
47 /// let mut acl_header = AclHeader::new();
48 /// acl_header.insert_bucket_x_cos_acl(BucketAcl::PublicRead);
49 /// let client = Client::new("foo", "bar", None, "qcloudtest-1256650966", "ap-guangzhou");
50 /// let res = client.put_bucket(Some(&acl_header)).await;
51 /// assert!(res.error_message.contains("403"));
52 /// };
53 /// ```
54 async fn put_bucket(&self, acl_header: Option<&AclHeader>) -> Response {
55 let headers = self.get_headers_with_auth("put", "/", acl_header, None, None);
56 let resp = Request::put(
57 self.get_full_url_from_path("/").as_str(),
58 None,
59 Some(&headers),
60 None,
61 None,
62 None as Option<Body>,
63 )
64 .await;
65 self.make_response(resp)
66 }
67 /// 删除指定的存储桶。该 API 的请求者需要对存储桶有写入权限。
68 /// 见[官网文档](https://cloud.tencent.com/document/product/436/7732)
69 /// # Examples
70 /// ```
71 /// use tencent_qcloud_cos_rs::client::Client;
72 /// use tencent_qcloud_cos_rs::bucket::Bucket;
73 /// async {
74 /// let client = Client::new("foo", "bar", None, "qcloudtest-1256650966", "ap-guangzhou");
75 /// let res = client.delete_bucket().await;
76 /// assert!(res.error_message.contains("403"));
77 /// };
78 /// ```
79 async fn delete_bucket(&self) -> Response {
80 let headers = self.get_headers_with_auth("delete", "/", None, None, None);
81 let resp = Request::delete(
82 self.get_full_url_from_path("/").as_str(),
83 None,
84 Some(&headers),
85 None,
86 None,
87 )
88 .await;
89 self.make_response(resp)
90 }
91 /// 列出该存储桶内的部分或者全部对象。该 API 的请求者需要对存储桶有读取权限。
92 /// 见[官网文档](https://cloud.tencent.com/document/product/436/7734)
93 /// # Examples
94 /// ```
95 /// use tencent_qcloud_cos_rs::client::Client;
96 /// use tencent_qcloud_cos_rs::bucket::Bucket;
97 /// async {
98 /// let client = Client::new("foo", "bar", None, "qcloudtest-1256650966", "ap-guangzhou");
99 /// let res = client.list_objects("prefix", "", "", "/", 100).await;
100 /// assert!(res.error_message.contains("403"));
101 /// };
102 /// ```
103 async fn list_objects(
104 &self,
105 prefix: &str,
106 delimiter: &str,
107 encoding_type: &str,
108 marker: &str,
109 max_keys: i32,
110 ) -> Response {
111 let mut query = HashMap::new();
112 if prefix.len() > 0 {
113 query.insert("prefix".to_string(), prefix.to_string());
114 }
115 if delimiter.len() > 0 {
116 query.insert("delimiter".to_string(), delimiter.to_string());
117 }
118 if encoding_type.len() > 0 {
119 query.insert("encoding-type".to_string(), encoding_type.to_string());
120 }
121 if marker.len() > 0 {
122 query.insert("marker".to_string(), marker.to_string());
123 }
124 if max_keys <= 1000 && max_keys > 0 {
125 query.insert("max-keys".to_string(), max_keys.to_string());
126 }
127 let headers = self.get_headers_with_auth("get", "/", None, None, Some(&query));
128 let resp = Request::get(
129 self.get_full_url_from_path("/").as_str(),
130 Some(&query),
131 Some(&headers),
132 )
133 .await;
134 self.make_response(resp)
135 }
136
137 /// 确认该存储桶是否存在,是否有权限访问
138 /// [官网文档](https://cloud.tencent.com/document/product/436/7735)
139 /// 存储桶存在且有读取权限,返回 `SUCCESS`
140 /// 无存储桶读取权限,返回 `ErrNo::STATUS`, error_message包含403。
141 /// 存储桶不存在,返回 `ErrNo::STATUS`, error_message包含404。
142 /// # Examples
143 /// ```
144 /// use tencent_qcloud_cos_rs::client::Client;
145 /// use tencent_qcloud_cos_rs::bucket::Bucket;
146 /// async {
147 /// let client = Client::new("foo", "bar", None, "qcloudtest-1256650966", "ap-guangzhou");
148 /// let res = client.check_bucket().await;
149 /// assert!(res.error_message.contains("403"));
150 /// };
151 /// ```
152 async fn check_bucket(&self) -> Response {
153 let headers = self.get_headers_with_auth("head", "/", None, None, None);
154 let resp = Request::head(
155 self.get_full_url_from_path("/").as_str(),
156 None,
157 Some(&headers),
158 )
159 .await;
160 self.make_response(resp)
161 }
162 /// 写入存储桶的访问控制列表
163 /// [官网文档](https://cloud.tencent.com/document/product/436/7737)
164 /// # Examples
165 /// ```
166 /// use tencent_qcloud_cos_rs::client::Client;
167 /// use tencent_qcloud_cos_rs::bucket::Bucket;
168 /// use tencent_qcloud_cos_rs::acl::{AclHeader, BucketAcl};
169 /// async {
170 /// let mut acl_header = AclHeader::new();
171 /// acl_header.insert_bucket_x_cos_acl(BucketAcl::PublicRead);
172 /// let client = Client::new("foo", "bar", None, "qcloudtest-1256650966", "ap-guangzhou");
173 /// let res = client.put_bucket(Some(&acl_header)).await;
174 /// assert!(res.error_message.contains("403"));
175 /// };
176 /// ```
177 async fn put_bucket_acl(&self, acl_header: &AclHeader) -> Response {
178 let mut query = HashMap::new();
179 query.insert("acl".to_string(), "".to_string());
180 let headers = self.get_headers_with_auth("put", "/", Some(acl_header), None, Some(&query));
181 let resp = Request::put(
182 self.get_full_url_from_path("/").as_str(),
183 Some(&query),
184 Some(&headers),
185 None,
186 None,
187 None as Option<Body>,
188 )
189 .await;
190 self.make_response(resp)
191 }
192}