1use snafu::{ResultExt, Snafu};
2
3use crate::{packet_buffer::BufferError, BytePacketBuffer, QueryType};
4
5#[derive(Debug, Snafu)]
6pub enum QuestionError {
7 InvalidBuffer { source: BufferError },
8}
9
10type Result<T> = std::result::Result<T, QuestionError>;
11
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct DnsQuestion {
14 pub name: String,
15 pub qtype: QueryType,
16}
17
18impl DnsQuestion {
19 pub fn new(name: String, qtype: QueryType) -> DnsQuestion {
20 DnsQuestion { name, qtype }
21 }
22
23 pub fn read(&mut self, buffer: &mut BytePacketBuffer) -> Result<()> {
24 buffer
25 .read_qname(&mut self.name)
26 .context(InvalidBufferSnafu)?;
27 self.qtype = QueryType::from_num(buffer.read_u16().context(InvalidBufferSnafu)?); let _ = buffer.read_u16().context(InvalidBufferSnafu)?; Ok(())
31 }
32
33 pub fn write(&self, buffer: &mut BytePacketBuffer) -> Result<()> {
34 buffer.write_qname(&self.name).context(InvalidBufferSnafu)?;
35
36 let typenum = self.qtype.to_num();
37 buffer.write_u16(typenum).context(InvalidBufferSnafu)?;
38 buffer.write_u16(1).context(InvalidBufferSnafu)?;
39
40 Ok(())
41 }
42}