netlink_packet_route/nsid/
message.rs1use netlink_packet_core::{DecodeError, Emitable, ErrorContext, Parseable};
4
5use crate::nsid::{NsidAttribute, NsidHeader, NsidMessageBuffer};
6
7#[derive(Debug, PartialEq, Eq, Clone, Default)]
8#[non_exhaustive]
9pub struct NsidMessage {
10 pub header: NsidHeader,
11 pub attributes: Vec<NsidAttribute>,
12}
13
14impl<'a, T: AsRef<[u8]> + 'a> Parseable<NsidMessageBuffer<&'a T>>
15 for NsidMessage
16{
17 fn parse(buf: &NsidMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
18 Ok(Self {
19 header: NsidHeader::parse(buf)
20 .context("failed to parse nsid message header")?,
21 attributes: Vec::<NsidAttribute>::parse(buf)
22 .context("failed to parse nsid message NLAs")?,
23 })
24 }
25}
26
27impl<'a, T: AsRef<[u8]> + 'a> Parseable<NsidMessageBuffer<&'a T>>
28 for Vec<NsidAttribute>
29{
30 fn parse(buf: &NsidMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
31 let mut attributes = vec![];
32 for nla_buf in buf.attributes() {
33 attributes.push(NsidAttribute::parse(&nla_buf?)?);
34 }
35 Ok(attributes)
36 }
37}
38
39impl Emitable for NsidMessage {
40 fn buffer_len(&self) -> usize {
41 self.header.buffer_len() + self.attributes.as_slice().buffer_len()
42 }
43
44 fn emit(&self, buffer: &mut [u8]) {
45 self.header.emit(buffer);
46 self.attributes
47 .as_slice()
48 .emit(&mut buffer[self.header.buffer_len()..]);
49 }
50}