dnsparse/
query_kind.rs

1use core::mem::size_of;
2
3use crate::Error;
4
5/// The kind of a DNS query.
6///
7/// According to [RFC 1035 Section 3.2.2](https://tools.ietf.org/rfc/rfc1035#section-3.2.2)
8/// and [RFC 1035 Section 3.2.3](https://tools.ietf.org/rfc/rfc1035#section-3.2.3).
9#[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}