netlink_packet_route/nsid/
message.rs1use crate::RouteNetlinkMessageParseMode;
4use crate::nsid::{NsidAttribute, NsidError, NsidHeader, NsidMessageBuffer};
5use netlink_packet_utils::nla::{HasNlas, NlaParseMode};
6use netlink_packet_utils::traits::{Emitable, Parseable, ParseableParametrized};
7
8#[derive(Debug, PartialEq, Eq, Clone, Default)]
9#[non_exhaustive]
10pub struct NsidMessage {
11 pub header: NsidHeader,
12 pub attributes: Vec<NsidAttribute>,
13}
14
15impl<'a, T: AsRef<[u8]> + 'a>
16 ParseableParametrized<NsidMessageBuffer<&'a T>, RouteNetlinkMessageParseMode> for NsidMessage
17{
18 type Error = NsidError;
19 fn parse_with_param(
20 buf: &NsidMessageBuffer<&'a T>,
21 mode: RouteNetlinkMessageParseMode,
22 ) -> Result<Self, NsidError> {
23 Ok(Self {
24 header: NsidHeader::parse(buf).unwrap(),
26 attributes: Vec::<NsidAttribute>::parse_with_param(buf, mode.into())?,
27 })
28 }
29}
30
31impl<'a, T: AsRef<[u8]> + 'a> ParseableParametrized<NsidMessageBuffer<&'a T>, NlaParseMode>
32 for Vec<NsidAttribute>
33{
34 type Error = NsidError;
35 fn parse_with_param(
36 buf: &NsidMessageBuffer<&'a T>,
37 mode: NlaParseMode,
38 ) -> Result<Self, NsidError> {
39 buf.parse_attributes(mode, NsidAttribute::parse)
40 }
41}
42
43impl Emitable for NsidMessage {
44 fn buffer_len(&self) -> usize {
45 self.header.buffer_len() + self.attributes.as_slice().buffer_len()
46 }
47
48 fn emit(&self, buffer: &mut [u8]) {
49 self.header.emit(buffer);
50 self.attributes.as_slice().emit(&mut buffer[self.header.buffer_len()..]);
51 }
52}