1use nom::{
2 number::streaming::{be_u16, be_u32},
3 IResult,
4};
5
6use crate::Error;
7
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
10pub struct ClassId {
11 pub oui: u32,
13 pub information_class_code: u16,
15 pub packet_class_code: u16,
17}
18
19impl ClassId {
20 pub fn parse(i: &[u8]) -> IResult<&[u8], ClassId> {
22 let (i, oui) = be_u32(i)?;
23 let (i, information_class_code) = be_u16(i)?;
24 let (i, packet_class_code) = be_u16(i)?;
25
26 Ok((
27 i,
28 ClassId {
29 oui,
30 information_class_code,
31 packet_class_code,
32 },
33 ))
34 }
35
36 pub fn serialize(&self, buffer: &mut [u8]) -> Result<usize, Error> {
38 if buffer.len() < 8 {
39 return Err(Error::BufferFull);
40 }
41
42 let mut word = u64::from(self.oui) << 32;
43 word |= u64::from(self.information_class_code) << 16;
44 word |= u64::from(self.packet_class_code);
45 buffer[0..8].copy_from_slice(&word.to_be_bytes());
46
47 Ok(8)
48 }
49}