1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{DnsClient, Result};
6
7use super::{managed_zone_operations::ManagedZoneOperation, ListEnvelope};
8
9#[derive(Serialize, Deserialize, Debug)]
10#[serde(rename_all = "snake_case")]
11pub struct ManagedZone {
12 pub kind: String, pub name: String,
14 pub dns_name: String,
15 pub description: String,
16 pub id: u64,
17 pub name_servers: Vec<String>,
18 pub creation_time: String,
19 pub dnssec_config: DnsSecConfig,
20 pub name_server_set: String,
21 pub visibility: String,
22 pub private_visibility_config: PrivateVisibilityConfig,
23 pub forwarding_config: ForwardingConfig,
24 pub labels: HashMap<String, serde_json::Value>,
25 pub peering_config: PeeringConfig,
26 pub reverse_lookup_config: ReverseLookupConfig,
27 pub service_directory_config: ServiceDirectoryConfig,
28}
29
30#[derive(Serialize, Deserialize, Debug)]
31#[serde(rename_all = "snake_case")]
32pub struct ServiceDirectoryConfig {
33 pub kind: String, pub namespace: ServiceDirectoryConfigNamespace,
35}
36
37#[derive(Serialize, Deserialize, Debug)]
38#[serde(rename_all = "snake_case")]
39pub struct ServiceDirectoryConfigNamespace {
40 pub kind: String, pub namespace_url: String,
42 pub deletion_time: String,
43}
44
45#[derive(Serialize, Deserialize, Debug)]
46#[serde(rename_all = "camelCase")]
47pub struct ReverseLookupConfig {
48 pub kind: String, }
50
51#[derive(Serialize, Deserialize, Debug)]
52#[serde(rename_all = "camelCase")]
53pub struct PeeringConfig {
54 pub kind: String, pub target_network: PeeringConfigTargetNetwork,
56}
57
58#[derive(Serialize, Deserialize, Debug)]
59#[serde(rename_all = "camelCase")]
60pub struct PeeringConfigTargetNetwork {
61 pub kind: String, pub network_url: String,
63 pub deactivate_time: String,
64}
65
66#[derive(Serialize, Deserialize, Debug)]
67#[serde(rename_all = "camelCase")]
68pub struct PrivateVisibilityConfig {
69 pub kind: String, pub networks: Vec<PrivateVisibilityConfigNetwork>,
71}
72
73#[derive(Serialize, Deserialize, Debug)]
74#[serde(rename_all = "camelCase")]
75pub struct ForwardingConfig {
76 pub kind: String, pub target_name_servers: Vec<ForwardingConfigNameServerTarget>,
78}
79
80#[derive(Serialize, Deserialize, Debug)]
81#[serde(rename_all = "camelCase")]
82pub struct ForwardingConfigNameServerTarget {
83 pub kind: String, pub ipv4_address: String,
85 pub forwarding_path: String,
86}
87
88#[derive(Serialize, Deserialize, Debug)]
89#[serde(rename_all = "camelCase")]
90pub struct PrivateVisibilityConfigNetwork {
91 pub kind: String, pub network_url: String,
93}
94
95#[derive(Serialize, Deserialize, Debug)]
96#[serde(rename_all = "camelCase")]
97pub struct DnsSecConfig {
98 pub kind: String, pub state: String,
100 pub default_key_specs: Vec<DefaultKeySpec>,
101 pub non_existence: String,
102}
103
104#[derive(Serialize, Deserialize, Debug)]
105#[serde(rename_all = "camelCase")]
106pub struct DefaultKeySpec {
107 pub kind: String, pub key_type: String,
109 pub algorithm: String,
110 pub key_length: u64,
111}
112
113#[derive(Serialize, Deserialize, Debug)]
114#[serde(rename_all = "camelCase")]
115pub struct ManagedZones {
116 #[serde(flatten)]
117 pub envelope: ListEnvelope,
118 pub managed_zones: Vec<ManagedZone>,
119}
120
121pub struct ManagedZonesHandler<'client> {
122 client: &'client DnsClient,
123}
124
125impl<'client> ManagedZonesHandler<'client> {
126 pub(crate) fn new(client: &'client DnsClient) -> Self {
127 Self { client }
128 }
129
130 pub async fn list(&self) -> Result<ManagedZones> {
131 let route = "managedZones".to_string();
132
133 self.client.get(route).await
134 }
135
136 pub async fn get(&self, managed_zone: String) -> Result<ManagedZone> {
137 let route = format!("managedZones/{managed_zone}", managed_zone = managed_zone,);
138
139 self.client.get(route).await
140 }
141
142 pub async fn patch(
143 &self,
144 managed_zone_id: &str,
145 managed_zone: ManagedZone,
146 ) -> Result<ManagedZoneOperation> {
147 let route = format!(
148 "managedZones/{managed_zone_id}",
149 managed_zone_id = managed_zone_id,
150 );
151 self.client.patch(route, Some(&managed_zone)).await
152 }
153
154 pub async fn create(&self, managed_zone: ManagedZone) -> Result<ManagedZone> {
155 let route = "managedZones".to_string();
156
157 self.client.post(route, Some(&managed_zone)).await
158 }
159
160 pub async fn delete(&self, managed_zone: &str) -> Result<()> {
161 let route = format!("managedZones/{managed_zone}", managed_zone = managed_zone,);
162
163 self.client.delete(route).await
164 }
165
166 pub async fn update(
167 &self,
168 managed_zone_id: &str,
169 managed_zone: ManagedZone,
170 ) -> Result<ManagedZoneOperation> {
171 let route = format!(
172 "managedZones/{managed_zone_id}",
173 managed_zone_id = managed_zone_id,
174 );
175
176 self.client.put(route, Some(&managed_zone)).await
177 }
178}