diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-13 20:10:32 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-13 20:10:32 +0100 |
commit | 8f80baff4d18b67859eded67b8c5097324693862 (patch) | |
tree | 380c5a9bfbd427c8363032a231b1da1fb30db960 /src/serialized_file.rs | |
parent | d3006b6d05f7995c6a49d67401293f1266b3ea1f (diff) | |
download | unity-tools-8f80baff4d18b67859eded67b8c5097324693862.tar unity-tools-8f80baff4d18b67859eded67b8c5097324693862.tar.bz2 unity-tools-8f80baff4d18b67859eded67b8c5097324693862.tar.zst |
read object abstraction
Diffstat (limited to 'src/serialized_file.rs')
-rw-r--r-- | src/serialized_file.rs | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/src/serialized_file.rs b/src/serialized_file.rs index b56fa3a..b3c1e3c 100644 --- a/src/serialized_file.rs +++ b/src/serialized_file.rs @@ -1,10 +1,11 @@ use crate::{ common_strings::COMMON_STRINGS, helper::{AlignExt, Endianness, ReadExt}, + object::Value, }; -use anyhow::{Result, bail}; +use anyhow::{Result, anyhow, bail}; use log::{debug, info, trace, warn}; -use std::io::{Cursor, Read, Seek}; +use std::io::{Cursor, Read, Seek, SeekFrom}; #[derive(Debug, Clone)] pub struct TypeTreeNode { @@ -32,7 +33,7 @@ pub struct SeralizedType { pub type_deps: Vec<u32>, } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct ObjectInfo { pub path_id: i64, pub data_offset: u64, @@ -55,7 +56,8 @@ pub struct External { } #[derive(Debug)] -pub struct SerializedFile { +pub struct SerializedFile<T> { + pub file: T, pub header: SerializedFileHeader, pub types: Vec<SeralizedType>, pub externals: Vec<External>, @@ -120,8 +122,9 @@ impl SerializedFileHeader { }) } } -impl SerializedFile { - pub fn read(mut file: impl Read + Seek) -> Result<SerializedFile> { + +impl<T: Read + Seek> SerializedFile<T> { + pub fn read(mut file: T) -> Result<SerializedFile<T>> { let h = SerializedFileHeader::read(&mut file)?; let e = h.endianness; @@ -293,6 +296,7 @@ impl SerializedFile { let user_string = file.read_cstr()?; Ok(SerializedFile { + file, header: h, types, externals, @@ -302,6 +306,32 @@ impl SerializedFile { user_string, }) } + + pub fn get_object_type_tree(&self, ob: &ObjectInfo) -> Result<&'_ TypeTreeNode> { + let r#type = if ob.type_id < 0 { + unimplemented!() + } else { + &self.types[ob.type_id as usize] + }; + r#type + .type_tree + .as_ref() + .ok_or(anyhow!("type tree missing")) + } + pub fn read_object(&mut self, ob: ObjectInfo) -> Result<Value> { + self.file.seek(SeekFrom::Start(ob.data_offset))?; + //? Duplicated impl from get_object_type_tree because borrow problem + let r#type = if ob.type_id < 0 { + unimplemented!() + } else { + &self.types[ob.type_id as usize] + }; + let typetree = r#type + .type_tree + .as_ref() + .ok_or(anyhow!("type tree missing"))?; + Value::read(typetree, self.endianness, &mut self.file) + } } impl TypeTreeNode { |