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 Svcb<'a> {
12 pub priority: u16,
14 pub weight: u16,
16 pub port: u16,
18 pub target: DnsName<'a>,
20 pub parameters: Characters<'a>,
22}
23
24impl<'a> RDataParse<'a> for Svcb<'a> {
25 #[inline]
26 fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
27 let priority = u16::parse(rdata, i)?;
28 let weight = u16::parse(rdata, i)?;
29 let port = u16::parse(rdata, i)?;
30 let target = DnsName::parse(rdata, i)?;
31 let parameters = Characters::parse(rdata, i)?;
32
33 Ok(Self {
34 priority,
35 weight,
36 port,
37 target,
38 parameters
39 })
40 }
41}
42
43impl<'a> WriteBytes for Svcb<'a> {
44 #[inline]
45 fn write<
46 const PTR_STORAGE: usize,
47 const DNS_SECTION: usize,
48 B: MutBuffer + Buffer,
49 >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
50 let mut bytes = 0;
51
52 bytes += self.priority.write(message)?;
53 bytes += self.weight.write(message)?;
54 bytes += self.port.write(message)?;
55 bytes += self.target.write(message)?;
56 bytes += self.parameters.write(message)?;
57
58 Ok(bytes)
59 }
60}
61
62#[cfg(test)]
63mod test {
64 use crate::rdata::testutils::parse_write_test;
65
66 use super::*;
67
68 parse_write_test!(
69 15,
70 [
71 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x03, b'w', b'w', b'w', 0x00, 0x03, b'w', b'w', b'w', ],
80 Svcb {
81 priority: 14,
82 weight: 14,
83 port: 14,
84 target: unsafe { DnsName::new_unchecked(b"\x03www\x00") },
85 parameters: unsafe { Characters::new_unchecked(b"www") },
86 },
87 );
88}