1use serde::{Deserialize, Serialize};
2
3use crate::{DnsClient, Result};
4
5use super::{resource_record_sets::ResourceRecordSet, ListEnvelope};
6
7#[derive(Serialize, Deserialize, Debug)]
8#[serde(rename_all = "camelCase")]
9pub struct Change {
10 pub kind: String, pub additions: Vec<ResourceRecordSet>,
12 pub deletions: Vec<ResourceRecordSet>,
13 pub start_time: String,
14 pub id: String,
15 pub status: Status,
16 pub is_serving: Option<bool>,
17}
18
19#[derive(Serialize, Deserialize, Debug)]
20#[serde(rename_all = "lowercase")]
21pub enum Status {
22 Done,
23 Pending,
24}
25
26#[derive(Serialize, Deserialize, Debug)]
27#[serde(rename_all = "camelCase")]
28pub struct Changes {
29 #[serde(flatten)]
30 pub envelope: ListEnvelope,
31 pub changes: Vec<Change>,
32}
33
34pub struct ChangesHandler<'client> {
35 client: &'client DnsClient,
36}
37
38impl<'client> ChangesHandler<'client> {
39 pub(crate) fn new(client: &'client DnsClient) -> Self {
40 Self { client }
41 }
42
43 pub async fn list(&self, managed_zone: &str) -> Result<Changes> {
44 let route = format!("managedZones/{}/changes", managed_zone);
45
46 self.client.get(route).await
47 }
48
49 pub async fn get(&self, managed_zone: &str, change_id: &str) -> Result<Change> {
50 let route = format!("managedZones/{}/changes/{}", managed_zone, change_id);
51
52 self.client.get(route).await
53 }
54
55 pub async fn create(&self, managed_zone: &str, change: Change) -> Result<Change> {
56 let route = format!("managedZones/{}/changes", managed_zone);
57
58 self.client.post(route, Some(&change)).await
59 }
60}