diff options
-rw-r--r-- | Cargo.lock | 96 | ||||
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | src/bin/parse.rs | 6 | ||||
-rw-r--r-- | src/object.rs | 34 | ||||
-rw-r--r-- | src/serialized_file.rs | 5 | ||||
-rw-r--r-- | src/unityfs.rs | 6 |
6 files changed, 145 insertions, 5 deletions
@@ -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]] @@ -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, |