1use super::{Class, NonEmptyVec};
2use crate::DomainName;
3use std::fmt::{Display, Formatter, Result as FmtResult};
4use std::net::Ipv4Addr;
5
6#[derive(Debug, Clone, PartialEq, Eq, Hash)]
11pub struct A {
12 pub domain_name: DomainName,
13 pub ttl: u32,
14 pub ipv4_addr: Ipv4Addr,
15}
16
17impl_to_type!(A);
18
19impl Display for A {
20 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
21 write!(
22 f,
23 "{} {} IN A {}",
24 self.domain_name, self.ttl, self.ipv4_addr
25 )
26 }
27}
28
29struct_domain_name!(
30 NS,
34 ns_d_name
35);
36
37struct_domain_name!(
38 MD,
42 mad_name
43);
44
45struct_domain_name!(
46 MF,
50 mad_name
51);
52
53struct_domain_name!(
54 CNAME,
58 c_name
59);
60
61#[derive(Debug, Clone, PartialEq, Eq, Hash)]
65pub struct SOA {
66 pub domain_name: DomainName,
67 pub ttl: u32,
68 pub class: Class,
69 pub m_name: DomainName,
70 pub r_name: DomainName,
71 pub serial: u32,
72 pub refresh: u32,
73 pub retry: u32,
74 pub expire: u32,
75 pub min_ttl: u32,
76}
77
78impl_to_type!(SOA);
79
80impl Display for SOA {
81 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
82 write!(
83 f,
84 "{} {} {} SOA {} {} ({} {} {} {} {})",
85 self.domain_name,
86 self.ttl,
87 self.class,
88 self.m_name,
89 self.r_name,
90 self.serial,
91 self.refresh,
92 self.retry,
93 self.expire,
94 self.min_ttl,
95 )
96 }
97}
98
99struct_domain_name!(
100 MB,
104 mad_name
105);
106
107struct_domain_name!(
108 MG,
112 mgm_name
113);
114
115struct_domain_name!(
116 MR,
120 new_name
121);
122
123struct_vec!(
124 NULL,
128 data
129);
130
131#[derive(Debug, Clone, PartialEq, Eq, Hash)]
135pub struct WKS {
136 pub domain_name: DomainName,
137 pub ttl: u32,
138 pub ipv4_addr: Ipv4Addr,
139 pub protocol: u8,
140 pub bit_map: Vec<u8>,
141}
142
143impl_to_type!(WKS);
144
145impl Display for WKS {
146 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
147 write!(
149 f,
150 "{} {} IN WKS {} {:x?}",
151 self.domain_name, self.ttl, self.protocol, self.bit_map
152 )
153 }
154}
155
156struct_domain_name!(
157 PTR,
161 ptr_d_name
162);
163
164#[derive(Debug, Clone, PartialEq, Eq, Hash)]
168pub struct HINFO {
169 pub domain_name: DomainName,
170 pub ttl: u32,
171 pub class: Class,
172 pub cpu: String,
173 pub os: String,
174}
175
176impl_to_type!(HINFO);
177
178impl Display for HINFO {
179 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
180 write!(
182 f,
183 "{} {} {} HINFO {} {}",
184 self.domain_name, self.ttl, self.class, self.cpu, self.os,
185 )
186 }
187}
188
189struct_domain_name_domain_name!(
190 MINFO,
194 r_mail_bx,
195 e_mail_bx
196);
197
198struct_u16_domain_name!(
199 MX,
203 preference,
204 exchange
205);
206
207#[derive(Debug, Clone, PartialEq, Eq, Hash)]
211pub struct TXT {
212 pub domain_name: DomainName,
213 pub ttl: u32,
214 pub class: Class,
215 pub strings: NonEmptyVec<String>,
216}
217
218impl_to_type!(TXT);
219
220impl Display for TXT {
221 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
222 write!(f, "{} {} {} TXT", self.domain_name, self.ttl, self.class,)?;
223 for string in self.strings.iter() {
224 write!(f, " \"{}\"", string.escape_default())?;
225 }
226 Ok(())
227 }
228}