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