#[allow(unused_imports)]
use super::*;
use crate::Result;
use alloc::string::String;
use alloc::vec::Vec;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlockHeader {
pub id: String,
pub reserved: u32,
pub length: u64,
pub link_count: u64,
}
impl Default for BlockHeader {
fn default() -> Self {
BlockHeader {
id: String::from("UNSET"),
reserved: 0,
length: 0,
link_count: 0,
}
}
}
impl BlockHeader {
pub fn to_bytes(&self) -> Result<Vec<u8>> {
let mut buffer = Vec::with_capacity(24);
let id_bytes = self.id.as_bytes();
let mut id_field = [0u8; 4];
let id_len = core::cmp::min(id_bytes.len(), 4);
id_field[..id_len].copy_from_slice(&id_bytes[..id_len]);
buffer.extend_from_slice(&id_field);
buffer.extend_from_slice(&self.reserved.to_le_bytes());
buffer.extend_from_slice(&self.length.to_le_bytes());
buffer.extend_from_slice(&self.link_count.to_le_bytes());
debug_assert_eq!(buffer.len(), 24);
Ok(buffer)
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
validate_buffer_size(bytes, 24)?;
let id = match core::str::from_utf8(&bytes[0..4]) {
Ok(s) => String::from(s),
Err(_) => String::from_utf8_lossy(&bytes[0..4]).into_owned(),
};
Ok(Self {
id,
reserved: read_u32(bytes, 4),
length: read_u64(bytes, 8),
link_count: read_u64(bytes, 16),
})
}
}