Skip to main content

u_sdk/oss/
region.rs

1//! [API 文档](https://help.aliyun.com/zh/oss/developer-reference/describeregions)
2
3use super::Client;
4use super::utils::{get_request_header, parse_xml_response};
5use crate::oss::Error;
6use crate::oss::sign_v4::HTTPVerb;
7use bon::Builder;
8use serde::Deserialize;
9use std::collections::HashMap;
10use url::Url;
11
12#[derive(Builder)]
13pub struct DescribeRegions<'a> {
14    #[builder(start_fn)]
15    pub(crate) client: &'a Client,
16    pub(crate) region: Option<&'a str>,
17}
18
19#[derive(Deserialize, Debug)]
20#[serde(rename_all = "PascalCase")]
21pub struct RegionInfoList {
22    pub region_info: Option<Vec<RegionInfo>>,
23}
24
25#[derive(Deserialize, Debug)]
26#[serde(rename_all = "PascalCase")]
27pub struct RegionInfo {
28    pub region: String,
29    pub internet_endpoint: String,
30    pub internal_endpoint: String,
31    pub accelerate_endpoint: String,
32}
33
34impl DescribeRegions<'_> {
35    /// - `region`: 如果为`None`,则查询所有支持地域对应的Endpoint信息
36    pub async fn send(&self) -> Result<RegionInfoList, Error> {
37        let client = self.client;
38
39        let request_url = Url::parse_with_params(
40            &format!("https://{}", client.endpoint),
41            [("regions", self.region.unwrap_or_default())],
42        )
43        .unwrap();
44
45        let creds = client.credentials_provider.load().await?;
46        let mut req_header_map = HashMap::new();
47        if let Some(token) = &creds.sts_security_token {
48            req_header_map.insert("x-oss-security-token".to_string(), token.clone());
49        }
50
51        let header_map = get_request_header(
52            &creds.access_key_id,
53            &creds.access_key_secret,
54            req_header_map,
55            &request_url,
56            HTTPVerb::Get,
57            &client.region,
58            None,
59        );
60
61        let resp = client
62            .http_client
63            .get(request_url)
64            .headers(header_map)
65            .send()
66            .await?;
67
68        let res = parse_xml_response(resp).await?;
69        Ok(res)
70    }
71}
72
73impl Client {
74    pub fn describe_regions(&self) -> DescribeRegionsBuilder<'_> {
75        DescribeRegions::builder(self)
76    }
77}