use byteorder::{LE, ReadBytesExt};
use num_enum::TryFromPrimitive;
use std::io::BufRead;
use crate::Result;
use crate::common::errors::TagError;
use crate::common::extensions::Enumerable;
#[derive(Default, Debug, TryFromPrimitive, PartialEq, Eq)]
#[repr(u16)]
pub enum TagStructType {
#[default]
MainStruct,
TagBlock,
Resource,
Custom,
Literal,
}
#[derive(Default, Debug, TryFromPrimitive, PartialEq, Eq)]
#[repr(u16)]
pub enum TagStructLocation {
#[default]
Internal,
Resource,
Debug,
}
#[derive(Default, Debug)]
pub struct TagStruct {
pub guid: u128,
pub struct_type: TagStructType,
pub location: TagStructLocation,
pub target_index: i32,
pub field_block: i32,
pub field_offset: u32,
}
impl Enumerable for TagStruct {
fn read<R: BufRead>(&mut self, reader: &mut R) -> Result<()> {
self.guid = reader.read_u128::<LE>()?;
self.struct_type = TagStructType::try_from(reader.read_u16::<LE>()?)
.map_err(TagError::InvalidTagStruct)?;
self.location = TagStructLocation::try_from(reader.read_u16::<LE>()?)
.map_err(TagError::InvalidTagStructLocation)?;
self.target_index = reader.read_i32::<LE>()?;
self.field_block = reader.read_i32::<LE>()?;
self.field_offset = reader.read_u32::<LE>()?;
Ok(())
}
}