vrt/types/
class_id.rs

1use nom::{
2    number::streaming::{be_u16, be_u32},
3    IResult,
4};
5
6use crate::Error;
7
8/// Class Identifier
9#[derive(Clone, Copy, Debug, Eq, PartialEq)]
10pub struct ClassId {
11    /// Organizationally Unique Identifier assigned by IEEE, VITA, the VRT Profile author, or a reserved OUI.
12    pub oui: u32,
13    /// Information Class Code
14    pub information_class_code: u16,
15    /// Packet Class Code
16    pub packet_class_code: u16,
17}
18
19impl ClassId {
20    /// Parse the Class ID
21    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    /// Serialize the Class ID
37    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}