proto_rs 0.11.26

Rust-first gRPC macros collection for .proto/protobufs managment and more
use std::collections::BTreeMap;
use std::collections::HashMap;

use proto_rs::ProtoDecode;
use proto_rs::ProtoEncode;
use proto_rs::encoding::DecodeContext;
use proto_rs::proto_message;

#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[proto_message]
pub struct Foo {
    #[proto(tag = 1)]
    pub id: u32,
    #[proto(tag = 2)]
    pub meta: u32,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[proto_message]
pub struct MapPrimitives {
    #[proto(tag = 1)]
    pub hash: HashMap<Foo, u32>,
    #[proto(tag = 2)]
    pub tree: BTreeMap<Foo, u32>,
}

#[test]
fn map_with_primitive_values_roundtrips() {
    let mut message = MapPrimitives::default();
    message.hash.insert(Foo { id: 7, meta: 11 }, 42);
    message.tree.insert(Foo { id: 1, meta: 2 }, 3);

    let encoded = MapPrimitives::encode_to_vec(&message);
    let decoded = <MapPrimitives as ProtoDecode>::decode(&encoded[..], DecodeContext::default()).expect("decode map with primitives");

    assert_eq!(decoded, message);
}

#[cfg(feature = "papaya")]
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[proto_message]
pub struct PapayaPrimitives {
    #[proto(tag = 1)]
    pub map: papaya::HashMap<Foo, u32>,
}

#[cfg(feature = "papaya")]
#[test]
fn papaya_map_with_primitive_values_roundtrips() {
    let message = PapayaPrimitives::default();

    {
        let guard = message.map.pin();
        guard.insert(Foo { id: 5, meta: 6 }, 99);
    }

    let encoded = PapayaPrimitives::encode_to_vec(&message);
    let decoded =
        <PapayaPrimitives as ProtoDecode>::decode(&encoded[..], DecodeContext::default()).expect("decode papaya map with primitives");

    assert_eq!(decoded, message);
}