1use core::mem::size_of;
2
3use crate::Error;
4
5#[derive(Copy, Clone, Debug, PartialEq)]
10#[repr(u16)]
11pub enum QueryKind {
12 A = 1,
13 NS = 2,
14 MD = 3,
15 MF = 4,
16 CNAME = 5,
17 SOA = 6,
18 MB = 7,
19 MG = 8,
20 MR = 9,
21 NULL = 10,
22 WKS = 11,
23 PTR = 12,
24 HINFO = 13,
25 MINFO = 14,
26 MX = 15,
27 TXT = 16,
28 AXFR = 252,
29 MAILB = 253,
30 MAILA = 254,
31 ALL = 255,
32 Reserved,
33}
34
35impl From<u16> for QueryKind {
36 fn from(n: u16) -> Self {
37 match n {
38 1 => Self::A,
39 2 => Self::NS,
40 3 => Self::MD,
41 4 => Self::MF,
42 5 => Self::CNAME,
43 6 => Self::SOA,
44 7 => Self::MB,
45 8 => Self::MG,
46 9 => Self::MR,
47 10 => Self::NULL,
48 11 => Self::WKS,
49 12 => Self::PTR,
50 13 => Self::HINFO,
51 14 => Self::MINFO,
52 15 => Self::MX,
53 16 => Self::TXT,
54 252 => Self::AXFR,
55 253 => Self::MAILA,
56 254 => Self::MAILB,
57 255 => Self::ALL,
58 _ => Self::Reserved,
59 }
60 }
61}
62
63impl QueryKind {
64 pub(crate) fn read(buf: &[u8], i: &mut usize) -> Result<Self, Error> {
65 if *i + size_of::<QueryKind>() <= buf.len() {
66 let query_kind = u16::from_be_bytes([buf[*i], buf[*i + 1]]);
67 *i += size_of::<QueryKind>();
68
69 return Ok(query_kind.into())
70 }
71
72 Err(Error::MessageTooShort)
73 }
74
75 pub(crate) fn to_be_bytes(self) -> [u8; 2] {
76 (self as u16).to_be_bytes()
77 }
78}