dns_message_parser/
dns.rs1use crate::question::Question;
2use crate::rr::RR;
3use crate::{Opcode, RCode};
4use std::fmt::{Display, Formatter, Result as FmtResult};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct Flags {
8 pub qr: bool,
9 pub opcode: Opcode,
10 pub aa: bool,
11 pub tc: bool,
12 pub rd: bool,
13 pub ra: bool,
14 pub ad: bool, pub cd: bool, pub rcode: RCode,
17}
18
19impl Display for Flags {
20 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
21 if self.qr {
22 write!(f, "qr ")?;
23 }
24
25 write!(f, "{:?} ", self.opcode)?;
26
27 if self.aa {
28 write!(f, "aa ")?;
29 }
30
31 if self.tc {
32 write!(f, "tc ")?;
33 }
34
35 if self.rd {
36 write!(f, "rd ")?;
37 }
38
39 if self.ra {
40 write!(f, "ra ")?;
41 }
42
43 if self.ad {
44 write!(f, "ad ")?;
45 }
46
47 if self.cd {
48 write!(f, "cd ")?;
49 }
50
51 write!(f, "{:?}", self.rcode)
52 }
53}
54
55#[derive(Debug, Clone, PartialEq, Eq)]
56pub struct Dns {
57 pub id: u16,
58 pub flags: Flags,
59 pub questions: Vec<Question>,
60 pub answers: Vec<RR>,
61 pub authorities: Vec<RR>,
62 pub additionals: Vec<RR>,
63}
64
65impl Dns {
66 #[inline]
67 pub const fn is_response(&self) -> bool {
68 self.flags.qr
69 }
70}
71
72#[inline]
73fn print_slice<T>(f: &mut Formatter<'_>, slice: &[T]) -> FmtResult
74where
75 T: Display,
76{
77 write!(f, "[")?;
78 for e in slice {
79 write!(f, "{}, ", e)?;
80 }
81 write!(f, "]")?;
82 Ok(())
83}
84
85impl Display for Dns {
86 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
87 write!(f, "{} {} ", self.id, self.flags)?;
88
89 if !self.questions.is_empty() {
90 write!(f, "questions ")?;
91 print_slice(f, &self.questions)?;
92 write!(f, " ")?;
93 }
94
95 if !self.answers.is_empty() {
96 write!(f, "answers ")?;
97 print_slice(f, &self.answers)?;
98 write!(f, " ")?;
99 }
100
101 if !self.authorities.is_empty() {
102 write!(f, "authorities ")?;
103 print_slice(f, &self.authorities)?;
104 write!(f, " ")?;
105 }
106
107 if !self.additionals.is_empty() {
108 write!(f, "additionals ")?;
109 print_slice(f, &self.additionals)?;
110 }
111
112 Ok(())
113 }
114}