infinite_rs/tag/
loader.rsuse std::io::SeekFrom;
use super::{
data_reference::TagDataReference, datablock::TagDataBlock, dependency::TagDependency,
header::TagHeader, reference::TagReference, structure::TagStruct,
};
use crate::common::extensions::BufReaderExt;
use crate::module::header::ModuleVersion;
use crate::Result;
#[derive(Default, Debug)]
pub struct TagFile {
pub header: TagHeader,
pub dependencies: Vec<TagDependency>,
pub datablock_definitions: Vec<TagDataBlock>,
pub struct_definitions: Vec<TagStruct>,
pub data_references: Vec<TagDataReference>,
pub tag_references: Vec<TagReference>,
}
impl TagFile {
pub fn read<R: BufReaderExt>(&mut self, reader: &mut R, version: &ModuleVersion) -> Result<()> {
self.header.read(reader)?;
self.dependencies =
reader.read_enumerable::<TagDependency>(u64::from(self.header.dependency_count))?;
self.datablock_definitions =
reader.read_enumerable::<TagDataBlock>(u64::from(self.header.datablock_count))?;
self.struct_definitions =
reader.read_enumerable::<TagStruct>(u64::from(self.header.tagstruct_count))?;
self.data_references = reader
.read_enumerable::<TagDataReference>(u64::from(self.header.data_reference_count))?;
self.tag_references =
reader.read_enumerable::<TagReference>(u64::from(self.header.tag_reference_count))?;
let string_table_position = reader.stream_position()?;
if version < &ModuleVersion::Season3 {
for dep in &mut self.dependencies {
reader.seek(SeekFrom::Start(
string_table_position + u64::from(dep.name_offset),
))?;
dep.name = Some(reader.read_null_terminated_string()?);
}
for reference in &mut self.tag_references {
reader.seek(SeekFrom::Start(
string_table_position + u64::from(reference.name_offset),
))?;
reference.name = Some(reader.read_null_terminated_string()?);
}
}
reader.seek(SeekFrom::Start(u64::from(self.header.header_size)))?;
Ok(())
}
}