use self::types::{
ListUrlForwardingResponse, UrlForwardingCreatePayload, UrlForwardingRecord, UrlForwardingUpdatePayload,
};
use super::{client::NameDotCom, endpoints};
use crate::Result;
pub mod types;
pub struct UrlForwardingClient<'a> {
client: &'a NameDotCom,
domain_name: &'a str,
}
impl<'a> UrlForwardingClient<'a> {
pub(super) fn new(client: &'a NameDotCom, domain_name: &'a str) -> Self {
Self { client, domain_name }
}
pub async fn list(&self) -> Result<Vec<UrlForwardingRecord>> {
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_URL_FORWARDING_SUFFIX,
page
);
let response: ListUrlForwardingResponse = self.client.get(&path).await?;
all_records.extend(response.forwards);
if response.next_page.is_none() {
break;
}
page = response.next_page.unwrap();
}
Ok(all_records)
}
pub async fn get(&self, host: &str) -> Result<UrlForwardingRecord> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_URL_FORWARDING_SUFFIX,
host
);
self.client.get(&path).await
}
pub async fn create(&self, payload: UrlForwardingCreatePayload<'_>) -> Result<UrlForwardingRecord> {
let path = format!(
"{}{}{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_URL_FORWARDING_SUFFIX
);
self.client.post(&path, payload).await
}
pub async fn update(&self, host: &str, payload: UrlForwardingUpdatePayload<'_>) -> Result<UrlForwardingRecord> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_URL_FORWARDING_SUFFIX,
host
);
self.client.put(&path, payload).await
}
pub async fn delete(&self, host: &str) -> Result<()> {
let path = format!(
"{}{}{}/{}",
endpoints::CORE_V1_DOMAINS_PREFIX,
self.domain_name,
endpoints::CORE_V1_URL_FORWARDING_SUFFIX,
host
);
self.client.delete(&path).await
}
}