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#[derive(Copy, Clone, Debug, PartialEq)]
10pub struct CName<'a> {
11 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}