object_storage/oss/
service.rs1use super::{
2 util::{
3 authorization::create_authorization,
4 datetime::create_datetime,
5 headers::construct_headers,
6 host::{create_host, create_url},
7 request::request,
8 },
9 Auth,
10};
11use anyhow::{Ok, Result};
12use reqwest::Method;
13use serde::{Deserialize, Serialize};
14
15#[derive(Serialize, Deserialize, Debug)]
16pub struct ListAllMyBucketsResult {
17 #[serde(rename = "Owner")]
18 pub owner: Owner,
19 #[serde(rename = "Buckets")]
20 pub buckets: Buckets,
21}
22
23#[derive(Serialize, Deserialize, Debug)]
24pub struct Owner {
25 #[serde(rename = "ID")]
26 pub id: String,
27 #[serde(rename = "DisplayName")]
28 pub display_name: String,
29}
30
31#[derive(Serialize, Deserialize, Debug)]
32pub struct Buckets {
33 #[serde(rename = "Bucket")]
34 pub bucket: Vec<BucketInfo>,
35}
36
37#[derive(Serialize, Deserialize, Debug)]
38pub struct BucketInfo {
39 #[serde(rename = "Comment")]
40 pub comment: String,
41 #[serde(rename = "CreationDate")]
42 pub creation_date: String,
43 #[serde(rename = "ExtranetEndpoint")]
44 pub extranet_endpoint: String,
45 #[serde(rename = "IntranetEndpoint")]
46 pub intranet_endpoint: String,
47 #[serde(rename = "Location")]
48 pub location: String,
49 #[serde(rename = "Name")]
50 pub name: String,
51 #[serde(rename = "Region")]
52 pub region: String,
53 #[serde(rename = "StorageClass")]
54 pub storage_class: String,
55}
56
57pub async fn list_bucket(auth: &Auth) -> Result<Vec<BucketInfo>> {
58 let host = create_host(None, "oss-cn-hangzhou").await?;
59 let url = create_url(&host, None).await?;
60 let datetime = create_datetime().await?;
61 let authorization = create_authorization(auth, "GET", None, &datetime, None, "/").await?;
62 let headers = construct_headers(None, None, None, &host, &datetime, &authorization).await;
63 let text = request(Method::GET, &url, headers, None).await?;
64 parse_bucket_info(&text).await
65}
66
67pub async fn parse_bucket_info(xml: &str) -> Result<Vec<BucketInfo>> {
68 let bucketlist: ListAllMyBucketsResult = serde_xml_rs::from_str(xml)?;
69 Ok(bucketlist.buckets.bucket)
70}