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