use binrw::BinRead;
#[derive(Debug, Clone, BinRead)]
#[br(little, magic = b"hbin")]
pub struct HbinHeader {
pub offset: u32,
pub size: u32,
pub reserved: u64,
pub timestamp: u64,
pub spare: u32,
}
impl HbinHeader {
pub const SIZE: u32 = 32;
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Cursor;
fn build_test_hbin(offset: u32, size: u32) -> Vec<u8> {
let mut buf = vec![0u8; 32];
buf[0..4].copy_from_slice(b"hbin");
buf[4..8].copy_from_slice(&offset.to_le_bytes());
buf[8..12].copy_from_slice(&size.to_le_bytes());
buf
}
#[test]
fn parse_hbin_header() {
let buf = build_test_hbin(0, 4096);
let mut cursor = Cursor::new(&buf[..]);
let hbin = HbinHeader::read(&mut cursor).unwrap();
assert_eq!(hbin.offset, 0);
assert_eq!(hbin.size, 4096);
}
#[test]
fn parse_second_hbin_with_offset() {
let buf = build_test_hbin(4096, 8192);
let mut cursor = Cursor::new(&buf[..]);
let hbin = HbinHeader::read(&mut cursor).unwrap();
assert_eq!(hbin.offset, 4096);
assert_eq!(hbin.size, 8192);
}
#[test]
fn rejects_invalid_signature() {
let mut buf = build_test_hbin(0, 4096);
buf[0..4].copy_from_slice(b"nope");
let mut cursor = Cursor::new(&buf[..]);
assert!(HbinHeader::read(&mut cursor).is_err());
}
}