aboutsummaryrefslogtreecommitdiff
path: root/src/serialized_file.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-13 20:10:32 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-13 20:10:32 +0100
commit8f80baff4d18b67859eded67b8c5097324693862 (patch)
tree380c5a9bfbd427c8363032a231b1da1fb30db960 /src/serialized_file.rs
parentd3006b6d05f7995c6a49d67401293f1266b3ea1f (diff)
downloadunity-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.rs42
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 {