use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout, U16, U32};
const BALE_EXTRA_TAG: u16 = 0xBA1D;
const BALE_EXTRA_DATA_SIZE: u16 = 4;
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, KnownLayout, Immutable)]
#[repr(C)]
pub struct BaleExtra {
pub tag: U16<zerocopy::LittleEndian>,
pub size: U16<zerocopy::LittleEndian>,
pub id: U32<zerocopy::LittleEndian>,
}
impl BaleExtra {
#[must_use]
pub fn new(id: u32) -> Self {
Self {
tag: U16::new(BALE_EXTRA_TAG),
size: U16::new(BALE_EXTRA_DATA_SIZE),
id: U32::new(id),
}
}
#[must_use]
pub fn id(&self) -> u32 {
self.id.get()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn size() {
assert_eq!(std::mem::size_of::<BaleExtra>(), 8);
}
#[test]
fn new() {
let extra = BaleExtra::new(42);
assert_eq!(extra.tag.get(), BALE_EXTRA_TAG);
assert_eq!(extra.size.get(), BALE_EXTRA_DATA_SIZE);
assert_eq!(extra.id(), 42);
}
#[test]
fn bytes() {
let extra = BaleExtra::new(0x12345678);
let bytes = extra.as_bytes();
assert_eq!(bytes[0], 0x1D);
assert_eq!(bytes[1], 0xBA);
assert_eq!(bytes[2], 0x04);
assert_eq!(bytes[3], 0x00);
assert_eq!(bytes[4], 0x78);
assert_eq!(bytes[5], 0x56);
assert_eq!(bytes[6], 0x34);
assert_eq!(bytes[7], 0x12);
}
}