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)]
12pub struct Kx<'a> {
13 pub preference: u16,
15 pub exchange: DnsName<'a>,
17}
18
19impl<'a> RDataParse<'a> for Kx<'a> {
20 #[inline]
21 fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
22 let preference = u16::parse(rdata.buffer, i)?;
23 let exchange = DnsName::parse(rdata.buffer, i)?;
24
25 Ok(Self {
26 preference,
27 exchange,
28 })
29 }
30}
31
32impl<'a> WriteBytes for Kx<'a> {
33 #[inline]
34 fn write<
35 const PTR_STORAGE: usize,
36 const DNS_SECTION: usize,
37 B: MutBuffer + Buffer,
38 >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
39 let mut bytes = 0;
40
41 bytes += self.preference.write(message)?;
42 bytes += self.exchange.write(message)?;
43
44 Ok(bytes)
45 }
46}
47
48#[cfg(test)]
49mod test {
50 use crate::rdata::testutils::parse_write_test;
51
52 use super::*;
53
54 parse_write_test!(
55 7,
56 [
57 0x00, 0x0e, 0x03, b'w', b'w', b'w', 0x00, ],
60 Kx {
61 preference: 14,
62 exchange: unsafe { DnsName::new_unchecked(b"\x03www\x00") },
63 },
64 );
65}