use self::types::{
DnsRecord, DnsRecordPayload, DnssecCreatePayload, DnssecRecord, ListDnsRecordsResponse, ListDnssecResponse,
};
use super::{client::NameDotCom, endpoints};
use crate::Result;
pub mod types;
pub struct DnsClient<'a> {
client: &'a NameDotCom,
domain_name: &'a str,
}
impl<'a> DnsClient<'a> {
pub(super) fn new(client: &'a NameDotCom, domain_name: &'a str) -> Self {
Self { client, domain_name }
}
pub async fn list_records(&self) -> Result<Vec<DnsRecord>> {
let mut all_records = Vec::new();
let mut page = 1;
loop {
let path = format!(
"{}{}{}?page={}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_RECORDS_SUFFIX,
page
);
let response: ListDnsRecordsResponse = self.client.get(&path).await?;
all_records.extend(response.records);
if response.next_page.is_none() {
break;
}
page = response.next_page.unwrap();
}
Ok(all_records)
}
pub async fn get_record(&self, record_id: i32) -> Result<DnsRecord> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_RECORDS_SUFFIX,
record_id
);
self.client.get(&path).await
}
pub async fn create_record(&self, payload: DnsRecordPayload<'_>) -> Result<DnsRecord> {
let path = format!(
"{}{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_RECORDS_SUFFIX,
);
self.client.post(&path, payload).await
}
pub async fn update_record(&self, record_id: i32, payload: DnsRecordPayload<'_>) -> Result<DnsRecord> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_RECORDS_SUFFIX,
record_id
);
self.client.put(&path, payload).await
}
pub async fn delete_record(&self, record_id: i32) -> Result<()> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_RECORDS_SUFFIX,
record_id
);
self.client.delete(&path).await
}
pub async fn list_dnssec(&self) -> Result<Vec<DnssecRecord>> {
let path = format!(
"{}{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_DNSSEC_SUFFIX
);
let response: ListDnssecResponse = self.client.get(&path).await?;
Ok(response.dnssec)
}
pub async fn get_dnssec(&self, digest: &str) -> Result<DnssecRecord> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_DNSSEC_SUFFIX,
digest
);
self.client.get(&path).await
}
pub async fn create_dnssec(&self, payload: DnssecCreatePayload<'_>) -> Result<DnssecRecord> {
let path = format!(
"{}{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_DNSSEC_SUFFIX
);
self.client.post(&path, payload).await
}
pub async fn delete_dnssec(&self, digest: &str) -> Result<()> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_DNSSEC_SUFFIX,
digest
);
self.client.delete(&path).await
}
}