1use crate::types::{self, DnsConfig, RRType};
2
3#[derive(Debug)]
4pub struct Client {
5 dns_config: DnsConfig,
6}
7
8impl Client {
9 pub fn from_env() -> anyhow::Result<Self> {
10 let dns_config = DnsConfig::from_env()?;
11 Ok(Self { dns_config })
12 }
13 pub fn new<T: ToString>(access_key_id: T, access_key_secret: T) -> Self {
14 let dns_config = DnsConfig::new(access_key_id.to_string(), access_key_secret.to_string());
15 Self { dns_config }
16 }
17}
18
19impl Client {
20 pub async fn query_domain_records(&self, domain_name: &str) -> anyhow::Result<types::QueryDomainRecordsResponse> {
21 static ACTION: &str = "DescribeDomainRecords";
22 let mut request = self.dns_config.get_request(reqwest::Method::GET, None)?;
23 request.url_mut().query_pairs_mut().append_pair("Action", ACTION);
24 request.url_mut().query_pairs_mut().append_pair("DomainName", domain_name);
25 let _ = self.dns_config.sign_request(&mut request)?;
26 let response = self.dns_config.get_request_builder(request)?.send().await?;
27 if !response.status().is_success() {
28 return Ok(types::QueryDomainRecordsResponse::Error(response.json().await?));
29 }
30 Ok(types::QueryDomainRecordsResponse::Success(response.json().await?))
31 }
32 pub async fn add_domain_record(&self, domain_name: &str, rr: &str, rr_type: RRType, value: &str, line: Option<&str>) -> anyhow::Result<types::AddDomainRecordResponse> {
33 static ACTION: &str = "AddDomainRecord";
34 let mut request = self.dns_config.get_request(reqwest::Method::GET, None)?;
35 request.url_mut().query_pairs_mut().append_pair("Action", ACTION);
36 request.url_mut().query_pairs_mut().append_pair("DomainName", domain_name);
37 request.url_mut().query_pairs_mut().append_pair("RR", rr);
38 request.url_mut().query_pairs_mut().append_pair("Type", rr_type.to_str());
39 request.url_mut().query_pairs_mut().append_pair("Value", value);
40 if let Some(line) = line {
41 request.url_mut().query_pairs_mut().append_pair("Line", line);
42 }
43 let _ = self.dns_config.sign_request(&mut request)?;
44 let response = self.dns_config.get_request_builder(request)?.send().await?;
45 if !response.status().is_success() {
46 return Ok(types::AddDomainRecordResponse::Error(response.json().await?));
47 }
48 Ok(types::AddDomainRecordResponse::Success(response.json().await?))
49 }
50 pub async fn update_domain_record(&self, record_id: &str, rr: &str, rr_type: RRType, value: &str, line: Option<&str>) -> anyhow::Result<types::UpdateDomainRecordResponse> {
51 static ACTION: &str = "UpdateDomainRecord";
52 let mut request = self.dns_config.get_request(reqwest::Method::GET, None)?;
53 request.url_mut().query_pairs_mut().append_pair("Action", ACTION);
54 request.url_mut().query_pairs_mut().append_pair("RecordId", record_id);
55 request.url_mut().query_pairs_mut().append_pair("RR", rr);
56 request.url_mut().query_pairs_mut().append_pair("Type", rr_type.to_str());
57 request.url_mut().query_pairs_mut().append_pair("Value", value);
58 if let Some(line) = line {
59 request.url_mut().query_pairs_mut().append_pair("Line", line);
60 }
61 let _ = self.dns_config.sign_request(&mut request)?;
62 let response = self.dns_config.get_request_builder(request)?.send().await?;
63 if !response.status().is_success() {
64 return Ok(types::UpdateDomainRecordResponse::Error(response.json().await?));
65 }
66 Ok(types::UpdateDomainRecordResponse::Success(response.json().await?))
67 }
68 pub async fn delete_domain_record(&self, record_id: &str) -> anyhow::Result<types::DelDomainRecordResponse> {
69 static ACTION: &str = "DeleteDomainRecord";
70 let mut request = self.dns_config.get_request(reqwest::Method::GET, None)?;
71 request.url_mut().query_pairs_mut().append_pair("Action", ACTION);
72 request.url_mut().query_pairs_mut().append_pair("RecordId", record_id);
73 let _ = self.dns_config.sign_request(&mut request)?;
74 let response = self.dns_config.get_request_builder(request)?.send().await?;
75 if !response.status().is_success() {
76 return Ok(types::DelDomainRecordResponse::Error(response.json().await?));
77 }
78 Ok(types::DelDomainRecordResponse::Success(response.json().await?))
79 }
80}