diff options
-rw-r--r-- | src/classes/assetinfo.rs | 2 | ||||
-rw-r--r-- | src/classes/gameobject.rs | 2 | ||||
-rw-r--r-- | src/classes/mesh.rs | 34 | ||||
-rw-r--r-- | src/classes/pptr.rs | 16 | ||||
-rw-r--r-- | src/classes/streaminginfo.rs | 2 | ||||
-rw-r--r-- | src/object/parser.rs | 2 | ||||
-rw-r--r-- | src/unityfs.rs | 2 |
7 files changed, 33 insertions, 27 deletions
diff --git a/src/classes/assetinfo.rs b/src/classes/assetinfo.rs index f66444a..c42c33a 100644 --- a/src/classes/assetinfo.rs +++ b/src/classes/assetinfo.rs @@ -12,7 +12,7 @@ pub struct AssetInfo { impl FromValue for AssetInfo { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("AssetInfo").unwrap(); + let mut fields = v.as_class("AssetInfo")?; Ok(AssetInfo { preload_index: fields.field("preloadIndex")?, preload_size: fields.field("preloadSize")?, diff --git a/src/classes/gameobject.rs b/src/classes/gameobject.rs index 494f3db..7e76dea 100644 --- a/src/classes/gameobject.rs +++ b/src/classes/gameobject.rs @@ -14,7 +14,7 @@ pub struct GameObject { impl FromValue for GameObject { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("GameObject").unwrap(); + let mut fields = v.as_class("GameObject")?; Ok(GameObject { components: fields .remove("m_Component") diff --git a/src/classes/mesh.rs b/src/classes/mesh.rs index 328af97..b6e6821 100644 --- a/src/classes/mesh.rs +++ b/src/classes/mesh.rs @@ -44,7 +44,7 @@ pub struct ChannelInfo { impl FromValue for Mesh { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("Mesh").unwrap(); + let mut fields = v.as_class("Mesh")?; Ok(Mesh { name: fields.field("m_Name")?, index_format: fields.field("m_IndexFormat")?, @@ -105,10 +105,14 @@ impl Mesh { impl FromValue for VertexData { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("VertexData").unwrap(); + let mut fields = v.as_class("VertexData")?; Ok(VertexData { vertex_count: fields.field("m_VertexCount")?, - data: fields.remove("m_DataSize").unwrap().as_typeless().unwrap(), + data: fields + .remove("m_DataSize") + .ok_or(anyhow!("m_DataSize missing"))? + .as_typeless() + .ok_or(anyhow!("m_DataSize is not typeless"))?, channels: fields .remove("m_Channels") .unwrap() @@ -168,26 +172,26 @@ impl VertexData { impl FromValue for ChannelInfo { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("ChannelInfo").unwrap(); + let mut fields = v.as_class("ChannelInfo")?; Ok(ChannelInfo { - dimension: fields.remove("dimension").unwrap().parse().unwrap(), - format: fields.remove("format").unwrap().parse().unwrap(), - offset: fields.remove("offset").unwrap().parse().unwrap(), - stream: fields.remove("stream").unwrap().parse().unwrap(), + dimension: fields.field("dimension")?, + format: fields.field("format")?, + offset: fields.field("offset")?, + stream: fields.field("stream")?, }) } } impl FromValue for SubMesh { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("SubMesh").unwrap(); + let mut fields = v.as_class("SubMesh")?; Ok(SubMesh { - topology: fields.remove("topology").unwrap().parse().unwrap(), - vertex_count: fields.remove("vertexCount").unwrap().parse().unwrap(), - base_vertex: fields.remove("baseVertex").unwrap().parse().unwrap(), - first_byte: fields.remove("firstByte").unwrap().parse().unwrap(), - first_vertex: fields.remove("firstVertex").unwrap().parse().unwrap(), - index_count: fields.remove("indexCount").unwrap().parse().unwrap(), + topology: fields.field("topology")?, + vertex_count: fields.field("vertexCount")?, + base_vertex: fields.field("baseVertex")?, + first_byte: fields.field("firstByte")?, + first_vertex: fields.field("firstVertex")?, + index_count: fields.field("indexCount")?, }) } } diff --git a/src/classes/pptr.rs b/src/classes/pptr.rs index 9d9becc..d6e4bb6 100644 --- a/src/classes/pptr.rs +++ b/src/classes/pptr.rs @@ -1,6 +1,6 @@ use super::HValue; use crate::object::{Value, parser::FromValue}; -use anyhow::Result; +use anyhow::{Result, anyhow, bail}; use serde::Serialize; use std::marker::PhantomData; @@ -16,18 +16,22 @@ pub struct PPtr<T = HValue> { impl<T> FromValue for PPtr<T> { fn from_value(v: Value) -> Result<Self> { let Value::Object { class, fields } = v else { - unreachable!() + bail!("PPtr expected but not an object") }; let inner = class .strip_prefix("PPtr<") - .unwrap() + .ok_or(anyhow!("not a PPtr"))? .strip_suffix(">") - .unwrap(); + .ok_or(anyhow!("PPtr '>' missing"))?; Ok(PPtr { class: inner.to_owned(), _class: PhantomData, - file_id: fields["m_FileID"].as_i32().unwrap(), - path_id: fields["m_PathID"].as_i64().unwrap(), + file_id: fields["m_FileID"] + .as_i32() + .ok_or(anyhow!("PPtr m_FileID is not i32"))?, + path_id: fields["m_PathID"] + .as_i64() + .ok_or(anyhow!("PPtr m_FileID is not i64"))?, }) } } diff --git a/src/classes/streaminginfo.rs b/src/classes/streaminginfo.rs index 5549efc..83b9f20 100644 --- a/src/classes/streaminginfo.rs +++ b/src/classes/streaminginfo.rs @@ -16,7 +16,7 @@ pub struct StreamingInfo { impl FromValue for StreamingInfo { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("StreamingInfo").unwrap(); + let mut fields = v.as_class("StreamingInfo")?; Ok(StreamingInfo { offset: fields.field("offset")?, size: fields.field("size")?, diff --git a/src/object/parser.rs b/src/object/parser.rs index d80e38c..2e5d027 100644 --- a/src/object/parser.rs +++ b/src/object/parser.rs @@ -21,7 +21,7 @@ impl Value { bail!("expected class {name} but found {class}") } } else { - bail!("expected class {name}") + bail!("expected class {name} but found something else") } } } diff --git a/src/unityfs.rs b/src/unityfs.rs index a23114d..05ad922 100644 --- a/src/unityfs.rs +++ b/src/unityfs.rs @@ -319,9 +319,7 @@ impl CompressionScheme { Ok(lz4_flex::block::decompress(&block, decomp_size)?) } // CompressionScheme::LZ4HC | CompressionScheme::LZ4 => { - // File::create("/tmp/a")?.write_all(&block)?; // Ok(lz4::block::decompress(&block, Some(decomp_size as i32))?) - // Ok(lz4::block::decompress(&block, None)?) // } CompressionScheme::Lzham => todo!(), } |