xt_oss/oss/api/bucket/
cname.rs

1use crate::oss;
2use builders::{CreateCnameTokenBuilder, GetCnameTokenBuilder, ListCnameBuilder, PutCnameBuilder};
3
4use self::builders::DeleteCnameBuilder;
5
6pub mod builders {
7    use crate::oss::{
8        self,
9        api::{self, ApiResponseFrom},
10        entities::cname::{
11            builders::BucketCnameConfigurationBuilder, BucketCnameConfiguration, Cname, CnameToken,
12            ListCnameResult,
13        },
14        http,
15    };
16
17    pub struct CreateCnameTokenBuilder<'a> {
18        client: &'a oss::Client<'a>,
19        cname: &'a str,
20    }
21
22    impl<'a> CreateCnameTokenBuilder<'a> {
23        pub fn new(client: &'a oss::Client, cname: &'a str) -> Self {
24            Self { client, cname }
25        }
26
27        fn config(&self) -> String {
28            let config = BucketCnameConfiguration {
29                cname: Cname {
30                    domain: self.cname.to_string(),
31                    ..Cname::default()
32                },
33            };
34            quick_xml::se::to_string(&config).unwrap()
35        }
36
37        pub async fn execute(&self) -> api::ApiResult<CnameToken> {
38            let res = format!("/{}/?cname&comp=token", self.client.bucket());
39            let url = format!("{}/?cname&comp=token", &self.client.base_url());
40
41            let data = oss::Bytes::from(self.config());
42
43            let resp = self
44                .client
45                .request
46                .task()
47                .with_url(&url)
48                .with_method(http::Method::POST)
49                .with_resource(&res)
50                .with_body(data)
51                .execute_timeout(self.client.timeout())
52                .await?;
53
54            Ok(ApiResponseFrom(resp).to_type().await)
55        }
56    }
57
58    pub struct GetCnameTokenBuilder<'a> {
59        client: &'a oss::Client<'a>,
60        cname: &'a str,
61    }
62
63    impl<'a> GetCnameTokenBuilder<'a> {
64        pub(crate) fn new(client: &'a oss::Client, cname: &'a str) -> Self {
65            Self { client, cname }
66        }
67
68        pub async fn execute(&self) -> api::ApiResult<CnameToken> {
69            let res = format!("/{}/?cname={}&comp=token", self.client.bucket(), self.cname);
70            let url = format!(
71                "{}/?cname={}&comp=token",
72                self.client.base_url(),
73                self.cname
74            );
75
76            let resp = self
77                .client
78                .request
79                .task()
80                .with_url(&url)
81                .with_resource(&res)
82                .execute_timeout(self.client.timeout())
83                .await?;
84
85            Ok(ApiResponseFrom(resp).to_type().await)
86        }
87    }
88
89    pub struct PutCnameBuilder<'a> {
90        client: &'a oss::Client<'a>,
91        bucket_cname_configuration: BucketCnameConfiguration,
92    }
93
94    impl<'a> PutCnameBuilder<'a> {
95        pub(crate) fn new(client: &'a oss::Client) -> Self {
96            Self {
97                client,
98                bucket_cname_configuration: BucketCnameConfiguration::default(),
99            }
100        }
101
102        pub fn with_config(mut self, value: BucketCnameConfiguration) -> Self {
103            self.bucket_cname_configuration = value;
104            self
105        }
106
107        fn config(&self) -> String {
108            quick_xml::se::to_string(&self.bucket_cname_configuration).unwrap()
109        }
110
111        pub async fn execute(&self) -> api::ApiResult {
112            let res = format!("/{}/?cname&comp=add", self.client.bucket());
113            let url = format!("{}/?cname&comp=add", self.client.base_url());
114
115            let data = oss::Bytes::from(self.config());
116
117            let resp = self
118                .client
119                .request
120                .task()
121                .with_url(&url)
122                .with_method(http::Method::POST)
123                .with_body(data)
124                .with_resource(&res)
125                .execute_timeout(self.client.timeout())
126                .await?;
127
128            Ok(ApiResponseFrom(resp).to_empty().await)
129        }
130    }
131
132    pub struct ListCnameBuilder<'a> {
133        client: &'a oss::Client<'a>,
134    }
135
136    impl<'a> ListCnameBuilder<'a> {
137        pub(crate) fn new(client: &'a oss::Client) -> Self {
138            Self { client }
139        }
140
141        pub async fn execute(&self) -> api::ApiResult<ListCnameResult> {
142            let res = format!("/{}/?{}", self.client.bucket(), "cname");
143            let url = format!("{}/?{}", self.client.base_url(), "cname");
144
145            let resp = self
146                .client
147                .request
148                .task()
149                .with_url(&url)
150                .with_resource(&res)
151                .execute_timeout(self.client.timeout())
152                .await?;
153
154            Ok(ApiResponseFrom(resp).to_type().await)
155        }
156    }
157
158    pub struct DeleteCnameBuilder<'a> {
159        client: &'a oss::Client<'a>,
160        cname: &'a str,
161    }
162
163    impl<'a> DeleteCnameBuilder<'a> {
164        pub(crate) fn new(client: &'a oss::Client, cname: &'a str) -> Self {
165            Self { client, cname }
166        }
167
168        fn config(&self) -> String {
169            let config = BucketCnameConfigurationBuilder::new()
170                .with_domain(self.cname)
171                .build();
172            quick_xml::se::to_string(&config).unwrap()
173        }
174
175        pub async fn execute(&self) -> api::ApiResult {
176            let res = format!("/{}/?cname&comp=delete", self.client.bucket());
177            let url = format!("{}/?cname&comp=delete", self.client.base_url());
178
179            let data = oss::Bytes::from(self.config());
180
181            let resp = self
182                .client
183                .request
184                .task()
185                .with_url(&url)
186                .with_resource(&res)
187                .with_method(http::Method::POST)
188                .with_body(data)
189                .execute_timeout(self.client.timeout())
190                .await?;
191
192            Ok(ApiResponseFrom(resp).to_empty().await)
193        }
194    }
195}
196
197/// # 自定义域名`CNAME``
198#[allow(non_snake_case)]
199impl<'a> oss::Client<'a> {
200    /// 调用CreateCnameToken接口创建域名所有权验证所需的CnameToken
201    ///
202    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/createcnametoken)
203    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_cname_create_token.rs)
204    pub fn CreateCnameToken(&self, cname: &'a str) -> CreateCnameTokenBuilder<'_> {
205        CreateCnameTokenBuilder::new(self, cname)
206    }
207
208    /// 调用GetCnameToken接口获取已创建的CnameToken
209    ///
210    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/getcnametoken)
211    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_cname_get_token.rs)
212    pub fn GetCnameToken(&self, cname: &'a str) -> GetCnameTokenBuilder<'_> {
213        GetCnameTokenBuilder::new(self, cname)
214    }
215
216    /// 调用PutCname接口为某个存储空间(Bucket)绑定自定义域名
217    ///
218    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/putcname)
219    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_cname_put.rs)
220    pub fn PutCname(&self) -> PutCnameBuilder<'_> {
221        PutCnameBuilder::new(self)
222    }
223
224    /// 调用ListCname接口用于查询某个存储空间(Bucket)下绑定的所有的自定义域名(Cname)列表
225    ///
226    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/listcname)
227    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_cname_list.rs)
228    pub fn ListCname(&self) -> ListCnameBuilder<'_> {
229        ListCnameBuilder::new(self)
230    }
231
232    /// 调用DeleteCname接口删除某个存储空间(Bucket)已绑定的Cname
233    ///
234    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/deletecname)
235    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_cname_del.rs)
236    pub fn DeleteCname(&self, cname: &'a str) -> DeleteCnameBuilder<'_> {
237        DeleteCnameBuilder::new(self, cname)
238    }
239}