Skip to main content

dna_rs/ops/
nameserver.rs

1use serde_json::{Value, json};
2
3use crate::client::DnaClient;
4use crate::error::DnaResult;
5use crate::models::domain::{ChildNsPayload, ModifyChildNsPayload, ModifyNsPayload, NsResponse};
6use crate::ops::util::ip_entry;
7
8impl DnaClient {
9    /// Replace all name-servers for a domain.
10    pub async fn modify_name_server(
11        &self,
12        domain_name: &str,
13        name_servers: Vec<String>,
14    ) -> DnaResult<Vec<String>> {
15        let payload = ModifyNsPayload {
16            domain_name: domain_name.into(),
17            name_servers: name_servers.clone(),
18        };
19        let resp: NsResponse = self.http.put("domains/dns/name-server", &payload).await?;
20        Ok(resp.name_servers.unwrap_or(name_servers))
21    }
22
23    /// Add a glue (child) name-server to a domain.
24    pub async fn add_child_name_server(
25        &self,
26        domain_name: &str,
27        host_name: &str,
28        ip_address: &str,
29    ) -> DnaResult<()> {
30        let payload = ChildNsPayload {
31            domain_name: domain_name.into(),
32            host_name: host_name.into(),
33            ip_addresses: vec![ip_entry(ip_address)],
34        };
35        let _: Value = self.http.post("domains/dns/host", &payload).await?;
36        Ok(())
37    }
38
39    /// Delete a glue name-server from a domain.
40    pub async fn delete_child_name_server(
41        &self,
42        domain_name: &str,
43        host_name: &str,
44    ) -> DnaResult<()> {
45        let body = json!({ "domainName": domain_name, "hostName": host_name });
46        let _: Value = self.http.delete("domains/dns/host", Some(&body)).await?;
47        Ok(())
48    }
49
50    /// Update the IP address of a glue name-server.
51    pub async fn modify_child_name_server(
52        &self,
53        domain_name: &str,
54        host_name: &str,
55        ip_address: &str,
56    ) -> DnaResult<()> {
57        let payload = ModifyChildNsPayload {
58            domain_name: domain_name.into(),
59            host_name: host_name.into(),
60            new_host_name: host_name.into(),
61            ip_addresses: vec![ip_entry(ip_address)],
62        };
63        let _: Value = self.http.put("domains/dns/host", &payload).await?;
64        Ok(())
65    }
66}