use crate::util::{read_i32_le, read_u16_le};
#[derive(Clone, Copy, Debug)]
pub struct ImpFile<'a> {
bytes: &'a [u8],
}
impl<'a> ImpFile<'a> {
pub const HEADER_SIZE: usize = 0x0E;
pub(crate) fn new(bytes: &'a [u8]) -> Self {
Self { bytes }
}
#[inline]
pub fn guid_offset(&self) -> i32 {
read_i32_le(self.bytes, 0x00).unwrap_or(-1)
}
#[inline]
pub fn lcid(&self) -> i32 {
read_i32_le(self.bytes, 0x04).unwrap_or(0)
}
#[inline]
pub fn major_version(&self) -> u16 {
read_u16_le(self.bytes, 0x08).unwrap_or(0)
}
#[inline]
pub fn minor_version(&self) -> u16 {
read_u16_le(self.bytes, 0x0A).unwrap_or(0)
}
#[inline]
pub fn size_field(&self) -> u16 {
read_u16_le(self.bytes, 0x0C).unwrap_or(0)
}
pub fn filename(&self) -> Option<&'a str> {
let name_len = (self.size_field() >> 2) as usize;
let name_bytes = self
.bytes
.get(Self::HEADER_SIZE..Self::HEADER_SIZE + name_len)?;
std::str::from_utf8(name_bytes).ok()
}
pub fn entry_size(&self) -> usize {
let name_len = (self.size_field() >> 2) as usize;
let unpadded = Self::HEADER_SIZE + name_len;
(unpadded + 3) & !3
}
}