gvas 0.11.0

Crate for parsing UE4 gvas save files.
Documentation
use gvas::{
    engine_version::FEngineVersion,
    game_version::DeserializedGameVersion,
    properties::{
        delegate_property::{
            Delegate, DelegateProperty, MulticastInlineDelegateProperty, MulticastScriptDelegate,
            MulticastSparseDelegateProperty,
        },
        Property,
    },
    types::{map::HashableIndexMap, Guid},
    GvasFile, GvasHeader,
};
use std::str::FromStr;

const DELEGATE_STR: &str =
    "/Temp/UEDPIE_0_Untitled_1.Untitled_1:PersistentLevel.Saver1_Blueprint_2";

pub(crate) fn expected() -> GvasFile {
    GvasFile {
        deserialized_game_version: DeserializedGameVersion::Default,
        header: GvasHeader::Version2 {
            package_file_version: 517,
            engine_version: FEngineVersion {
                major: 4,
                minor: 23,
                patch: 1,
                change_list: 9631420,
                branch: String::from("++UE4+Release-4.23"),
            },
            custom_version_format: 3,
            custom_versions: HashableIndexMap::from([
                (
                    Guid::from_str("22D5549C-BE4F-26A8-4607-2194D082B461").unwrap(),
                    23,
                ),
                (
                    Guid::from_str("E432D8B0-0D4F-891F-B77E-CFACA24AFD36").unwrap(),
                    10,
                ),
                (
                    Guid::from_str("2843C6E1-534D-2CA2-868E-6CA38CBD1764").unwrap(),
                    0,
                ),
                (
                    Guid::from_str("3CC15E37-FB48-E406-F084-00B57E712A26").unwrap(),
                    3,
                ),
                (
                    Guid::from_str("ED68B0E4-E942-94F4-0BDA-31A241BB462E").unwrap(),
                    34,
                ),
                (
                    Guid::from_str("3F74FCCF-8044-B043-DF14-919373201D17").unwrap(),
                    35,
                ),
                (
                    Guid::from_str("B5492BB0-E944-20BB-B732-04A36003E452").unwrap(),
                    2,
                ),
                (
                    Guid::from_str("5C10E4A4-B549-A159-C440-C5A7EEDF7E54").unwrap(),
                    0,
                ),
                (
                    Guid::from_str("C931C839-DC47-E65A-179C-449A7C8E1C3E").unwrap(),
                    0,
                ),
                (
                    Guid::from_str("331BF078-984F-EAEB-EA84-B4B9A25AB9CC").unwrap(),
                    0,
                ),
                (
                    Guid::from_str("0F383166-E043-4D2D-27CF-09805AA95669").unwrap(),
                    0,
                ),
                (
                    Guid::from_str("9F8BF812-FC4A-7588-0CD9-7CA629BD3A38").unwrap(),
                    31,
                ),
                (
                    Guid::from_str("4CE75A7B-104C-70D2-9857-58A95A2A210B").unwrap(),
                    11,
                ),
                (
                    Guid::from_str("186929D7-DD4B-D61D-A864-E29D8438C13C").unwrap(),
                    2,
                ),
                (
                    Guid::from_str("7852A1C2-FE4A-E7BF-FF90-176C55F71D53").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("D4A3AC6E-C14C-EC40-ED8B-86B7C58F4209").unwrap(),
                    3,
                ),
                (
                    Guid::from_str("DD75E529-2746-A3E0-76D2-109DEADC2C23").unwrap(),
                    17,
                ),
                (
                    Guid::from_str("5DA643AF-4749-D37F-8E3E-739805BBC1D9").unwrap(),
                    2,
                ),
                (
                    Guid::from_str("EC6C266B-8F4B-C71E-D9E4-0BA307FC4209").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("613DF70D-EA47-3FA2-E989-27B79A49410C").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("86181D60-844F-64AC-DED3-16AAD6C7EA0D").unwrap(),
                    27,
                ),
                (
                    Guid::from_str("D6BCFF9D-5801-4F49-8212-21E288A8923C").unwrap(),
                    6,
                ),
                (
                    Guid::from_str("ACD0AEF2-6F41-FE9A-7FAA-6486FCD626FA").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("0B1F4F17-A545-C6B4-E82E-3FB17D91FBD0").unwrap(),
                    9,
                ),
                (
                    Guid::from_str("E79E7F71-3A49-B0E9-3291-B3880781381B").unwrap(),
                    6,
                ),
                (
                    Guid::from_str("B3DC7D8E-BB47-DA80-A246-D39FF64D9893").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("CDB08ACB-DE4B-8CE7-9313-62A862EFE914").unwrap(),
                    0,
                ),
                (
                    Guid::from_str("F20A68FB-A34B-EF59-B519-A8BA3D44C873").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("9186E0AF-5249-0D3A-3B67-73B61E2DF27C").unwrap(),
                    2,
                ),
                (
                    Guid::from_str("BDFDB52E-104D-AC01-8FF3-3681DAA59333").unwrap(),
                    5,
                ),
                (
                    Guid::from_str("4F359D50-2F49-E6F6-B285-49A71C633C07").unwrap(),
                    0,
                ),
                (
                    Guid::from_str("EAB762A4-3A4E-99F4-1FEC-C199B2E12482").unwrap(),
                    2,
                ),
                (
                    Guid::from_str("194D0C43-7049-5471-699B-6987E5B090DF").unwrap(),
                    13,
                ),
                (
                    Guid::from_str("BD32FEAA-144C-9553-255E-6AB6DDD13210").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("8EE1AF23-584E-E14C-52C2-618DB7BE53B9").unwrap(),
                    8,
                ),
                (
                    Guid::from_str("40EB564A-DC11-F510-7E34-D392E76AC9B2").unwrap(),
                    2,
                ),
                (
                    Guid::from_str("004A8AD7-9746-58E8-B519-A8BAB4467D48").unwrap(),
                    17,
                ),
                (
                    Guid::from_str("86F87955-1F4C-3A93-7B08-BA832FB96163").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("52BE2F61-0B40-53DA-914F-0D917C85B19F").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("367A23A4-C941-EACA-F818-A28FF31B6858").unwrap(),
                    4,
                ),
                (
                    Guid::from_str("753F4E80-494B-8870-068C-D6A4DCB67E3C").unwrap(),
                    5,
                ),
                (
                    Guid::from_str("ED0A3111-614D-552E-A39A-67AF2C08A1C5").unwrap(),
                    17,
                ),
                (
                    Guid::from_str("965196AB-FC08-D845-8D22-D7B79E56AD78").unwrap(),
                    1,
                ),
                (
                    Guid::from_str("F37ABB24-834F-4656-C22D-2F1FFF96AD49").unwrap(),
                    4,
                ),
                (
                    Guid::from_str("12E426FB-4D4B-151F-0A55-7293702F1D96").unwrap(),
                    3,
                ),
            ]),
            save_game_class_name: String::from("/Script/SaveFileTest.TestSaveGame"),
        },
        properties: HashableIndexMap::from([
            (
                String::from("DynamicDelegate"),
                Property::from(DelegateProperty::new(Delegate::new(
                    String::from(DELEGATE_STR),
                    String::from("FirstBinding"),
                ))),
            ),
            (
                String::from("MulticastDelegate"),
                Property::from(MulticastInlineDelegateProperty::new(
                    MulticastScriptDelegate::new(vec![
                        Delegate::new(String::from(DELEGATE_STR), String::from("FirstBinding")),
                        Delegate::new(String::from(DELEGATE_STR), String::from("SecondBinding")),
                    ]),
                )),
            ),
            (
                String::from("MulticastSparseDelegate"),
                Property::from(MulticastSparseDelegateProperty::new(
                    MulticastScriptDelegate::new(vec![Delegate::new(
                        String::from(DELEGATE_STR),
                        String::from("FirstBinding"),
                    )]),
                )),
            ),
        ]),
    }
}