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}