use super::{client::NameDotCom, endpoints};
use crate::Result;
use self::types::{
ListVanityNsResponse, VanityNameserver, VanityNsCreatePayload, VanityNsUpdatePayload,
};
pub mod types;
pub struct VanityNameserverClient<'a> {
client: &'a NameDotCom,
domain_name: &'a str,
}
impl<'a> VanityNameserverClient<'a> {
pub(super) fn new(client: &'a NameDotCom, domain_name: &'a str) -> Self {
Self { client, domain_name }
}
pub async fn list(&self) -> Result<Vec<VanityNameserver>> {
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_VANITY_NS_SUFFIX,
page
);
let response: ListVanityNsResponse = self.client.get(&path).await?;
all_records.extend(response.vanity_ns);
if response.next_page.is_none() {
break;
}
page = response.next_page.unwrap();
}
Ok(all_records)
}
pub async fn get(&self, hostname: &str) -> Result<VanityNameserver> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_VANITY_NS_SUFFIX,
hostname
);
self.client.get(&path).await
}
pub async fn create(&self, payload: VanityNsCreatePayload<'_>) -> Result<VanityNameserver> {
let path = format!(
"{}{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_VANITY_NS_SUFFIX
);
self.client.post(&path, payload).await
}
pub async fn update(
&self,
hostname: &str,
payload: VanityNsUpdatePayload<'_>,
) -> Result<VanityNameserver> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_VANITY_NS_SUFFIX,
hostname
);
self.client.put(&path, payload).await
}
pub async fn delete(&self, hostname: &str) -> Result<()> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_VANITY_NS_SUFFIX,
hostname
);
self.client.delete(&path).await
}
}