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