flex_dns/rdata/
ptr.rs

1use crate::{Buffer, DnsMessage, DnsMessageError, MutBuffer};
2use crate::name::DnsName;
3use crate::parse::Parse;
4use crate::rdata::{RData, RDataParse};
5use crate::write::WriteBytes;
6
7/// # A domain name pointer
8/// This record is used to return a canonical name for an alias
9#[derive(Copy, Clone, Debug, PartialEq)]
10pub struct Ptr<'a> {
11    /// The canonical name for the alias
12    pub name: DnsName<'a>,
13}
14
15impl<'a> RDataParse<'a> for Ptr<'a> {
16    #[inline]
17    fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
18        let name = DnsName::parse(rdata.buffer, i)?;
19
20        Ok(Self {
21            name,
22        })
23    }
24}
25
26impl<'a> WriteBytes for Ptr<'a> {
27    #[inline]
28    fn write<
29        const PTR_STORAGE: usize,
30        const DNS_SECTION: usize,
31        B: MutBuffer + Buffer,
32    >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
33        self.name.write(message)
34    }
35}
36
37#[cfg(test)]
38mod test {
39    use crate::rdata::testutils::parse_write_test;
40
41    use super::*;
42
43    parse_write_test!(
44        17,
45        [
46            0x03, b'w', b'w', b'w',
47            0x07, b'e', b'x', b'a', b'm', b'p', b'l', b'e',
48            0x03, b'c', b'o', b'm',
49            0x00,
50        ],
51        Ptr {
52            name: unsafe { DnsName::new_unchecked(b"\x03www\x07example\x03com\x00") },
53        },
54    );
55}