1use 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 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 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}