use crate::structures::common::{self, StructureError};
pub struct SeamaHeader {
pub data_size: usize,
pub header_size: usize,
}
pub fn parse_seama_header(seama_data: &[u8]) -> Result<SeamaHeader, StructureError> {
const MAGIC: usize = 0x5EA3A417;
let seama_structure = vec![
("magic", "u32"),
("description_size", "u32"),
("data_size", "u32"),
("unknown1", "u64"),
("unknown2", "u64"),
];
let mut endianness: &str = "little";
let available_data = seama_data.len();
let header_size: usize = common::size(&seama_structure);
if let Ok(mut seama_header) = common::parse(seama_data, &seama_structure, endianness) {
if seama_header["magic"] != MAGIC {
endianness = "big";
match common::parse(seama_data, &seama_structure, endianness) {
Err(_) => {
return Err(StructureError);
}
Ok(seama_header_be) => {
seama_header = seama_header_be.clone();
}
}
}
if seama_header["magic"] == MAGIC {
let total_header_size = header_size + seama_header["description_size"];
if total_header_size >= header_size && available_data >= total_header_size {
return Ok(SeamaHeader {
data_size: seama_header["data_size"],
header_size: total_header_size,
});
}
}
}
Err(StructureError)
}