1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
use crate::framework::{
endpoint::{Endpoint, Method},
response::ApiResult,
};
use crate::framework::{OrderDirection, SearchMatch};
use chrono::offset::Utc;
use chrono::DateTime;
use std::net::{Ipv4Addr, Ipv6Addr};
pub struct ListDnsRecords<'a> {
pub zone_identifier: &'a str,
pub params: ListDnsRecordsParams,
}
impl<'a> Endpoint<Vec<DnsRecord>, ListDnsRecordsParams> for ListDnsRecords<'a> {
fn method(&self) -> Method {
Method::Get
}
fn path(&self) -> String {
format!("zones/{}/dns_records", self.zone_identifier)
}
fn query(&self) -> Option<ListDnsRecordsParams> {
Some(self.params.clone())
}
}
pub struct CreateDnsRecord<'a> {
pub zone_identifier: &'a str,
pub params: CreateDnsRecordParams<'a>,
}
impl<'a> Endpoint<DnsRecord, (), CreateDnsRecordParams<'a>> for CreateDnsRecord<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("zones/{}/dns_records", self.zone_identifier)
}
fn body(&self) -> Option<CreateDnsRecordParams<'a>> {
Some(self.params.clone())
}
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
pub struct CreateDnsRecordParams<'a> {
pub ttl: Option<u32>,
pub priority: Option<u16>,
pub proxied: Option<bool>,
pub name: &'a str,
#[serde(flatten)]
pub content: DnsContent,
}
pub struct DeleteDnsRecord<'a> {
pub zone_identifier: &'a str,
pub identifier: &'a str,
}
impl<'a> Endpoint<DeleteDnsRecordResponse> for DeleteDnsRecord<'a> {
fn method(&self) -> Method {
Method::Delete
}
fn path(&self) -> String {
format!(
"zones/{}/dns_records/{}",
self.zone_identifier, self.identifier
)
}
}
#[derive(Serialize, Clone, Debug)]
#[serde(rename_all = "lowercase")]
pub enum ListDnsRecordsOrder {
Type,
Name,
Content,
Ttl,
Proxied,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug, Default)]
pub struct ListDnsRecordsParams {
pub record_type: Option<DnsContent>,
pub name: Option<String>,
pub page: Option<u32>,
pub per_page: Option<u32>,
pub order: Option<ListDnsRecordsOrder>,
pub direction: Option<OrderDirection>,
#[serde(rename = "match")]
pub search_match: Option<SearchMatch>,
}
#[derive(Deserialize, Debug)]
pub struct Meta {
pub auto_added: bool,
}
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(tag = "type")]
pub enum DnsContent {
A { content: Ipv4Addr },
AAAA { content: Ipv6Addr },
CNAME { content: String },
NS { content: String },
MX { content: String, priority: u16 },
TXT { content: String },
}
#[derive(Deserialize, Debug)]
pub struct DeleteDnsRecordResponse {
pub id: String,
}
#[derive(Deserialize, Debug)]
pub struct DnsRecord {
pub meta: Meta,
pub locked: bool,
pub name: String,
pub ttl: u32,
pub zone_id: String,
pub modified_on: DateTime<Utc>,
pub created_on: DateTime<Utc>,
pub proxiable: bool,
#[serde(flatten)]
pub content: DnsContent,
pub id: String,
pub proxied: bool,
pub zone_name: String,
}
impl ApiResult for DnsRecord {}
impl ApiResult for Vec<DnsRecord> {}
impl ApiResult for DeleteDnsRecordResponse {}