aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/parse.rs6
-rw-r--r--src/object.rs34
-rw-r--r--src/serialized_file.rs5
-rw-r--r--src/unityfs.rs6
4 files changed, 47 insertions, 4 deletions
diff --git a/src/bin/parse.rs b/src/bin/parse.rs
index 496f4d3..c0cb0e5 100644
--- a/src/bin/parse.rs
+++ b/src/bin/parse.rs
@@ -1,3 +1,4 @@
+use log::debug;
use std::{
env::args,
fs::File,
@@ -39,7 +40,10 @@ fn main() -> anyhow::Result<()> {
let value = read_value(typetree.type_tree.as_ref().unwrap(), e, &mut cab)?;
- // eprintln!("{value:#?}")
+ debug!(
+ "{}",
+ serde_json::to_string_pretty(&value.to_json()).unwrap()
+ )
}
// eprintln!("{:#?}", file.types);
}
diff --git a/src/object.rs b/src/object.rs
index 5275eb7..ab27ea4 100644
--- a/src/object.rs
+++ b/src/object.rs
@@ -1,7 +1,7 @@
use crate::helper::{AlignExt, Endianness, ReadExt};
use crate::serialized_file::TypeTreeNode;
use anyhow::Result;
-use log::{debug, trace};
+use log::trace;
use std::io::Seek;
use std::{collections::BTreeMap, io::Read};
@@ -92,3 +92,35 @@ pub fn read_value(
}
r
}
+
+impl Value {
+ pub fn to_json(self) -> serde_json::Value {
+ match self {
+ Value::Bool(x) => serde_json::Value::Bool(x),
+ Value::U8(x) => serde_json::Value::Number(x.into()),
+ Value::U16(x) => serde_json::Value::Number(x.into()),
+ Value::I16(x) => serde_json::Value::Number(x.into()),
+ Value::U32(x) => serde_json::Value::Number(x.into()),
+ Value::I32(x) => serde_json::Value::Number(x.into()),
+ Value::F32(x) => serde_json::Value::Number(
+ serde_json::Number::from_f64(x as f64).unwrap_or(0.into()),
+ ),
+ Value::I64(x) => serde_json::Value::Number(x.into()),
+ Value::F64(x) => serde_json::Value::Number(serde_json::Number::from_f64(x).unwrap()),
+ Value::String(x) => serde_json::Value::String(x),
+ Value::Array(values) => {
+ serde_json::Value::Array(values.into_iter().map(Value::to_json).collect())
+ }
+ Value::Object { class, fields } => serde_json::Value::Object(
+ fields
+ .into_iter()
+ .map(|(k, v)| (k, v.to_json()))
+ .chain(Some((
+ "_class".to_string(),
+ serde_json::Value::String(class),
+ )))
+ .collect(),
+ ),
+ }
+ }
+}
diff --git a/src/serialized_file.rs b/src/serialized_file.rs
index cdf6125..d8238ea 100644
--- a/src/serialized_file.rs
+++ b/src/serialized_file.rs
@@ -2,7 +2,7 @@ use crate::{
common_strings::COMMON_STRINGS,
helper::{AlignExt, Endianness, ReadExt},
};
-use anyhow::Result;
+use anyhow::{Result, bail};
use log::{debug, info, trace};
use std::io::{Cursor, Read, Seek};
@@ -82,6 +82,9 @@ pub fn read_serialized_file_header(mut file: impl Read + Seek) -> Result<Seriali
let format = file.read_u32_be()?;
let mut data_offset = file.read_u32_be()? as u64;
+ if format >= 1000 {
+ bail!("bad format version {format:x}")
+ }
info!("File format version: {format}");
assert!(format >= 9);
diff --git a/src/unityfs.rs b/src/unityfs.rs
index 677a135..d3eb81f 100644
--- a/src/unityfs.rs
+++ b/src/unityfs.rs
@@ -1,5 +1,6 @@
use crate::helper::{AlignExt, ReadExt};
use anyhow::{Result, anyhow, bail};
+use humansize::DECIMAL;
use log::{debug, info, trace};
use std::io::{Cursor, Error, ErrorKind, Read, Seek, SeekFrom};
@@ -115,7 +116,10 @@ impl<T: Read + Seek> UnityFS<T> {
let size = blockindex.read_u64_be()?;
let status = blockindex.read_u32_be()?;
let name = blockindex.read_cstr()?;
- info!("found node {name:?} (offset={offset}, size={size}, status={status})");
+ info!(
+ "found node {name:?} (size={}, status={status})",
+ humansize::format_size(size, DECIMAL)
+ );
nodes.push(NodeInfo {
offset,
size,