aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock96
-rw-r--r--Cargo.toml3
-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
6 files changed, 145 insertions, 5 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 64f091c..726677f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -109,6 +109,15 @@ dependencies = [
]
[[package]]
+name = "humansize"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
+dependencies = [
+ "libm",
+]
+
+[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -121,6 +130,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
+name = "itoa"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
+
+[[package]]
+name = "libm"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
+
+[[package]]
name = "log"
version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -157,6 +178,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]]
+name = "proc-macro2"
+version = "1.0.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -186,12 +225,61 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
+name = "ryu"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
+
+[[package]]
+name = "serde"
+version = "1.0.218"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.218"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.139"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+]
+
+[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
+name = "syn"
+version = "2.0.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
name = "twox-hash"
version = "1.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -202,14 +290,22 @@ dependencies = [
]
[[package]]
+name = "unicode-ident"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
+
+[[package]]
name = "unity-tools"
version = "0.1.0"
dependencies = [
"anyhow",
"env_logger",
+ "humansize",
"log",
"lz4_flex",
"lzma",
+ "serde_json",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index bcfc594..075e17f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,4 +9,5 @@ env_logger = "0.11.6"
anyhow = "1.0.95"
lz4_flex = "0.11.3"
lzma = "0.2.2"
-# lz4 = "1.28.1"
+serde_json = "1.0.139"
+humansize = "2.1.3"
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,