miden-objects 0.17.0-rc.6

Canonical Protobuf representations for Miden protocol objects
Documentation
use assert_matches::assert_matches;
use miden_protocol::asset::{AssetVault, FungibleAsset, NonFungibleAsset};
use prost::Message;

use crate::{DecodeMessage, Verify, proto};

#[test]
fn fungible_asset_roundtrips_through_structured_protobuf() {
    let asset = FungibleAsset::mock(42);

    let encoded = proto::asset::Asset::from(asset);

    assert_eq!(
        encoded.asset_id.as_ref().unwrap().version,
        proto::asset::AssetVersion::V1 as i32
    );
    assert_matches!(
        encoded.asset_id.as_ref().unwrap().composition,
        Some(proto::asset::asset_id::Composition::Fungible(()))
    );
    let encoded = proto::asset::Asset::decode(encoded.encode_to_vec().as_slice()).unwrap();
    assert_eq!(encoded.decode_fields().unwrap().verify().unwrap(), asset);
}

#[test]
fn non_fungible_asset_roundtrips_through_structured_protobuf() {
    let asset = NonFungibleAsset::mock(&[1, 2, 3]);

    let encoded = proto::asset::Asset::from(asset);

    assert_matches!(
        encoded.asset_id.as_ref().unwrap().composition,
        Some(proto::asset::asset_id::Composition::NonFungible(_))
    );
    let encoded = proto::asset::Asset::decode(encoded.encode_to_vec().as_slice()).unwrap();
    assert_eq!(encoded.decode_fields().unwrap().verify().unwrap(), asset);
}

#[test]
fn asset_vault_roundtrips_through_protobuf() {
    let vault = AssetVault::mock();

    let encoded = proto::asset::AssetVault::from(&vault);
    assert_eq!(encoded.assets.len(), vault.num_assets());

    let encoded = proto::asset::AssetVault::decode(encoded.encode_to_vec().as_slice()).unwrap();
    assert_eq!(encoded.decode_fields().unwrap().verify().unwrap(), vault);
}