Skip to main content

ali_oss_rs/
cname.rs

1//! Bucket cname
2
3use crate::{
4    cname_common::{CnameInfo, ListCnameResult},
5    error::Error,
6    request::{OssRequest, RequestMethod},
7    util::validate_bucket_name,
8    Client, Result,
9};
10use async_trait::async_trait;
11
12#[async_trait]
13pub trait CnameOperations {
14    /// List bucket cname
15    ///
16    /// Official document: <https://help.aliyun.com/zh/oss/developer-reference/listcname>
17    async fn list_cname<S>(&self, bucket_name: S) -> Result<Vec<CnameInfo>>
18    where
19        S: AsRef<str> + Send;
20}
21
22#[async_trait]
23impl CnameOperations for Client {
24    // List bucket cname
25    ///
26    /// Official document: <https://help.aliyun.com/zh/oss/developer-reference/listcname>
27    async fn list_cname<S>(&self, bucket_name: S) -> Result<Vec<CnameInfo>>
28    where
29        S: AsRef<str> + Send,
30    {
31        let bucket_name = bucket_name.as_ref();
32
33        if !validate_bucket_name(bucket_name) {
34            return Err(Error::Other(format!("invalid bucket name: {}", bucket_name)));
35        }
36
37        let request = OssRequest::new().method(RequestMethod::Get).bucket(bucket_name).add_query("cname", "");
38
39        let (_, xml) = self.do_request::<String>(request).await?;
40
41        let ListCnameResult { cnames } = ListCnameResult::from_xml(&xml)?;
42
43        Ok(cnames)
44    }
45}
46
47#[cfg(test)]
48pub mod test_cname_async {
49    use std::sync::Once;
50
51    use crate::{cname::CnameOperations, Client};
52
53    static INIT: Once = Once::new();
54
55    fn setup_comp() {
56        INIT.call_once(|| {
57            simple_logger::init_with_level(log::Level::Debug).unwrap();
58            dotenvy::from_filename(".env.comp").unwrap();
59        });
60    }
61
62    #[tokio::test]
63    async fn test_cname_async_1() {
64        setup_comp();
65
66        let client = Client::from_env();
67
68        let res = client.list_cname("mi-public").await;
69        assert!(res.is_ok());
70
71        let cnames = res.unwrap();
72        assert_eq!(3, cnames.len());
73
74        log::debug!("{:#?}", cnames);
75
76        assert!(cnames.iter().any(|item| item.domain == "public-cdn-oss.mosoteach.cn"));
77    }
78}