netlink_packet_route/nsid/
message.rs

1// SPDX-License-Identifier: MIT
2
3use 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}