adns_proto/types/
mod.rs

1// needed due to some issue in strum
2#![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    // EDNS
70    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    // question types
102    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}