io_unity 0.3.0

io_unity is a lib for read unity assets
Documentation
pub mod type_tree;

use crate::def_unity_class;
use crate::serialized_file::SerializedFile;
use crate::type_tree::TypeTreeObject;
use crate::unity_asset_view::UnityAssetViewer;

use std::path::PathBuf;

use super::SerializedFileRef;

def_unity_class!(PPtr);

pub trait PPtrObject: SerializedFileRef {
    fn get_path_id(&self) -> anyhow::Result<i64>;
    fn get_file_id(&self) -> anyhow::Result<i64>;

    fn get_serialized_file<'a>(
        &self,
        self_serialized_file: &'a SerializedFile,
        viewer: Option<&'a UnityAssetViewer>,
    ) -> anyhow::Result<&'a SerializedFile> {
        let file_id = self.get_file_id()?;

        if file_id == 0 {
            return Ok(self_serialized_file);
        }

        if let Some(viewer) = viewer {
            let externals = self_serialized_file.get_externals();

            if file_id > 0 {
                if let Some(external) = externals.get(file_id as usize - 1) {
                    if let Some(file_name) = PathBuf::from(&external.path.to_string())
                        .file_name()
                        .map(|f| f.to_string_lossy().into_owned())
                    {
                        if let Some(serialized_file) =
                            viewer.get_serialized_file_by_path(&file_name)
                        {
                            return Ok(serialized_file);
                        }
                    }
                }
            }
        }
        Err(anyhow!("cannot find serialized_file. The serialized file contain the object which pptr point to may not has add to Viewer."))
    }

    fn get_type_tree_object(
        &self,
        self_serialized_file: &SerializedFile,
        viewer: Option<&UnityAssetViewer>,
    ) -> anyhow::Result<Option<TypeTreeObject>> {
        let path_id = self.get_path_id()?;
        let serialized_file = self.get_serialized_file(self_serialized_file, viewer)?;
        serialized_file.get_tt_object_by_path_id(path_id)
    }

    fn get_type_tree_object_in_view(
        &self,
        viewer: &UnityAssetViewer,
    ) -> anyhow::Result<Option<TypeTreeObject>> {
        let self_serialized_file = viewer
            .serialized_file_map
            .get(&self.get_serialized_file_id())
            .ok_or(anyhow!("cannot find serialized_file"))?;
        self.get_type_tree_object(self_serialized_file, Some(viewer))
    }
}