infinite_rs/tag/
datablock.rsuse byteorder::{ReadBytesExt, LE};
use num_enum::TryFromPrimitive;
use std::io::BufRead;
use crate::common::errors::{Error, TagError};
use crate::common::extensions::Enumerable;
use crate::Result;
#[derive(Default, Debug, TryFromPrimitive, PartialEq, Eq)]
#[repr(u16)]
pub enum TagSectionType {
#[default]
Header,
TagData,
ResourceData,
ActualResource,
}
#[derive(Default, Debug)]
pub struct TagDataBlock {
pub entry_size: u32,
padding: u16,
pub section_type: TagSectionType,
pub offset: u64,
}
impl Enumerable for TagDataBlock {
fn read<R: BufRead>(&mut self, reader: &mut R) -> Result<()> {
self.entry_size = reader.read_u32::<LE>()?;
self.padding = reader.read_u16::<LE>()?;
self.section_type = TagSectionType::try_from(reader.read_u16::<LE>()?)
.map_err(|e| Error::TagError(TagError::InvalidTagSection(e)))?;
self.offset = reader.read_u64::<LE>()?;
Ok(())
}
}