1#![allow(deprecated)]
3
4use strum::FromRepr;
5
6mod data;
7pub use data::*;
8
9mod data_parser;
10pub use data_parser::*;
11
12#[derive(
13 Clone,
14 Copy,
15 PartialEq,
16 Eq,
17 Debug,
18 FromRepr,
19 strum::Display,
20 strum::EnumString,
21 PartialOrd,
22 Ord,
23 strum::IntoStaticStr,
24)]
25#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26#[repr(u16)]
27pub enum Type {
28 A = 1,
29 NS,
30 #[deprecated]
31 MD,
32 #[deprecated]
33 MF,
34 CNAME,
35 SOA,
36 #[deprecated]
37 MB,
38 #[deprecated]
39 MG,
40 #[deprecated]
41 MR,
42 #[deprecated]
43 NULL,
44 #[deprecated]
45 WKS,
46 PTR,
47 HINFO,
48 #[deprecated]
49 MINFO,
50 MX,
51 TXT,
52 RP,
53 AFSDB,
54
55 SIG = 24,
56 KEY,
57
58 AAAA = 28,
59 LOC,
60
61 SRV = 33,
62
63 NAPTR = 35,
64 KX,
65 CERT,
66
67 DNAME = 39,
68
69 OPT = 41,
71
72 APL = 42,
73 DS,
74 SSHFP,
75 IPSECKEY,
76 RRSIG,
77 NSEC,
78 DNSKEY,
79 DHCID,
80 NSEC3,
81 NSEC3PARAM,
82 TLSA,
83 SMIMEA,
84
85 HIP = 55,
86
87 CDS = 59,
88 CDNSKEY,
89 OPENPGPKEY,
90 CSYNC,
91 ZONEMD,
92 SVCB,
93 HTTPS,
94
95 EUI48 = 108,
96 EUI64,
97
98 TKEY = 249,
99 TSIG,
100
101 IXFR,
103 AXFR,
104 #[deprecated]
105 MAILB,
106 #[deprecated]
107 MAILA,
108 #[strum(to_string = "*")]
109 ALL,
110
111 URI = 256,
112 CAA,
113
114 TA = 32768,
115 DLV,
116
117 Other(u16),
118}
119
120impl From<u16> for Type {
121 fn from(value: u16) -> Self {
122 if let Some(out) = Type::from_repr(value) {
123 if out != Type::Other(0) {
124 return out;
125 }
126 }
127 Type::Other(value)
128 }
129}
130
131impl Type {
132 fn discriminant(&self) -> u16 {
133 unsafe { *(self as *const Self as *const u16) }
134 }
135
136 pub fn is_question_type(&self) -> bool {
137 *self >= Type::IXFR && *self <= Type::ALL
138 }
139
140 pub fn wants_by_query(&self, other: Type) -> bool {
141 *self == other
142 }
143}
144
145impl From<Type> for u16 {
146 fn from(value: Type) -> Self {
147 match value {
148 Type::Other(x) => x,
149 x => x.discriminant(),
150 }
151 }
152}