antidns/
question.rs

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)?); // qtype
28        let _ = buffer.read_u16().context(InvalidBufferSnafu)?; // class
29
30        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}