unity-asset-binary 0.2.0

Unity binary file format parser (AssetBundle, SerializedFile)
Documentation
use std::sync::Arc;

use unity_asset_binary::file::{UnityFile, load_unity_file};
use unity_asset_binary::typetree::InMemoryTypeTreeRegistry;

#[test]
fn registry_can_restore_typetree_parsing_when_stripped() {
    let path =
        std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../tests/samples/banner_1");
    let mut bundle = match load_unity_file(&path).expect("load sample bundle") {
        UnityFile::AssetBundle(b) => b,
        other => panic!("expected AssetBundle, got {:?}", other.kind()),
    };

    let file = bundle.assets.get_mut(0).expect("bundle has asset 0");

    let original_tree = file
        .types
        .iter()
        .find(|t| t.class_id == 28)
        .expect("bundle asset has Texture2D type tree")
        .type_tree
        .clone();

    let mut registry = InMemoryTypeTreeRegistry::default();
    registry.insert_any(28, original_tree);

    file.enable_type_tree = false;
    for t in file.types.iter_mut() {
        t.type_tree.clear();
    }
    file.set_type_tree_registry(Some(Arc::new(registry)));

    let handle = file
        .find_object_handle(-3875358842991402074)
        .expect("Texture2D object handle exists");

    let peek = handle.peek_name().expect("peek_name");
    assert_eq!(peek.as_deref(), Some("banner_1"));

    let obj = handle.read().expect("read object via registry TypeTree");
    assert_eq!(obj.name().as_deref(), Some("banner_1"));
    assert_eq!(obj.get("m_Width").and_then(|v| v.as_i64()), Some(492));
    assert_eq!(obj.get("m_Height").and_then(|v| v.as_i64()), Some(180));
}