1use crate::{Buffer, DnsMessage, DnsMessageError, MutBuffer};
2use crate::characters::Characters;
3use crate::name::DnsName;
4use crate::parse::Parse;
5use crate::rdata::{RData, RDataParse};
6use crate::write::WriteBytes;
7
8#[derive(Copy, Clone, Debug, PartialEq)]
11pub struct Naptr<'a> {
12 pub order: u16,
14 pub preference: u16,
16 pub flags: Characters<'a>,
18 pub service: Characters<'a>,
20 pub regexp: Characters<'a>,
22 pub replacement: DnsName<'a>,
24}
25
26impl<'a> RDataParse<'a> for Naptr<'a> {
27 #[inline]
28 fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
29 let order = u16::parse(rdata.buffer, i)?;
30 let preference = u16::parse(rdata.buffer, i)?;
31 let flags = Characters::parse(rdata.buffer, i)?;
32 let service = Characters::parse(rdata.buffer, i)?;
33 let regexp = Characters::parse(rdata.buffer, i)?;
34 let replacement = DnsName::parse(rdata.buffer, i)?;
35
36 Ok(Self {
37 order,
38 preference,
39 flags,
40 service,
41 regexp,
42 replacement,
43 })
44 }
45}
46
47impl<'a> WriteBytes for Naptr<'a> {
48 #[inline]
49 fn write<
50 const PTR_STORAGE: usize,
51 const DNS_SECTION: usize,
52 B: MutBuffer + Buffer,
53 >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
54 let mut bytes = 0;
55
56 bytes += self.order.write(message)?;
57 bytes += self.preference.write(message)?;
58 bytes += self.flags.write(message)?;
59 bytes += self.service.write(message)?;
60 bytes += self.regexp.write(message)?;
61 bytes += self.replacement.write(message)?;
62
63 Ok(bytes)
64 }
65}
66
67#[cfg(test)]
68mod test {
69 use crate::rdata::testutils::parse_write_test;
70
71 use super::*;
72
73 parse_write_test!(
74 21,
75 [
76 0x00, 0x0e, 0x00, 0x0f, 0x03, b'a', b'b', b'c', 0x03, b'd', b'e', b'f', 0x03, b'g', b'h', b'i', 0x03, b'j', b'k', b'l', 0x00, ],
83 Naptr {
84 order: 14,
85 preference: 15,
86 flags: unsafe { Characters::new_unchecked(b"abc") },
87 service: unsafe { Characters::new_unchecked(b"def") },
88 regexp: unsafe { Characters::new_unchecked(b"ghi") },
89 replacement: unsafe { DnsName::new_unchecked(b"\x03jkl\x00") },
90 },
91 );
92}