use self::types::{
AvailabilityResult, CheckAvailabilityRequest, CheckAvailabilityResponse, CreateDomainRequest, CreateDomainResponse,
Domain, DomainCreatePayload, GetAuthCodeResponse, ListDomainsResponse, SetNameserversRequest, UpdateDomainPayload,
};
use super::{client::NameDotCom, endpoints};
use crate::Result;
pub mod types;
pub struct DomainsClient<'a> {
client: &'a NameDotCom,
}
impl<'a> DomainsClient<'a> {
pub(super) fn new(client: &'a NameDotCom) -> Self {
Self { client }
}
pub async fn list(&self) -> Result<Vec<Domain>> {
let mut all_domains = Vec::new();
let mut page = 1;
loop {
let path = format!("{}?page={}", endpoints::CORE_V1_DOMAINS_PREFIX, page);
let response: ListDomainsResponse = self.client.get(&path).await?;
all_domains.extend(response.domains);
if response.next_page.is_none() {
break;
}
page = response.next_page.unwrap();
}
Ok(all_domains)
}
pub async fn check_availability(&self, domain_names: &[&str]) -> Result<Vec<AvailabilityResult>> {
let path = format!(
"{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
endpoints::CORE_V1_ACTION_CHECK_AVAILABILITY
);
let body = CheckAvailabilityRequest {
domain_names: domain_names.iter().map(|s| s.to_string()).collect(),
};
let response: CheckAvailabilityResponse = self.client.post(&path, body).await?;
Ok(response.results)
}
pub async fn create(&self, domain_name: &str) -> Result<CreateDomainResponse> {
let payload = DomainCreatePayload { domain_name };
let body = CreateDomainRequest { domain: payload };
self.client.post(endpoints::CORE_V1_DOMAINS_PREFIX, body).await
}
pub fn domain(&self, domain_name: &'a str) -> DomainClient<'a> {
DomainClient {
client: self.client,
domain_name,
}
}
}
pub struct DomainClient<'a> {
client: &'a NameDotCom,
domain_name: &'a str,
}
impl<'a> DomainClient<'a> {
pub(super) fn new(client: &'a NameDotCom, domain_name: &'a str) -> Self {
Self { client, domain_name }
}
pub async fn get(&self) -> Result<Domain> {
let path = format!("{}{}", endpoints::CORE_V1_DOMAINS_PREFIX, self.domain_name);
self.client.get(&path).await
}
pub async fn update(&self, payload: UpdateDomainPayload) -> Result<Domain> {
let path = format!("{}{}", endpoints::CORE_V1_DOMAINS_PREFIX, self.domain_name);
self.client.patch(&path, payload).await
}
pub async fn get_auth_code(&self) -> Result<String> {
let path = format!(
"{}{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_ACTION_GET_AUTH_CODE
);
let response: GetAuthCodeResponse = self.client.get(&path).await?;
Ok(response.auth_code)
}
pub async fn set_nameservers(&self, nameservers: &[&str]) -> Result<Domain> {
let path = format!(
"{}{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_ACTION_SET_NAMESERVERS
);
let body = SetNameserversRequest {
nameservers: nameservers.iter().map(|s| s.to_string()).collect(),
};
self.client.post(&path, body).await
}
}