object_storage/oss/
service.rs

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