diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-24 19:31:17 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-24 19:31:17 +0100 |
commit | 2c06cea2337627c08600e99fc0b1c69799526049 (patch) | |
tree | 5779ebb87a54fefa367ffac30e8ad251cb4b8ef3 /src | |
parent | 46a49718b09fa5a517d2aa8dceadcc1713ffc51a (diff) | |
download | unity-tools-2c06cea2337627c08600e99fc0b1c69799526049.tar unity-tools-2c06cea2337627c08600e99fc0b1c69799526049.tar.bz2 unity-tools-2c06cea2337627c08600e99fc0b1c69799526049.tar.zst |
json conversion
Diffstat (limited to 'src')
-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 |
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, |