bromine 0.22.1

A flexible ipc protocol (previously rmp-ipc)
Documentation
#[cfg(feature = "serialize")]
use bromine::prelude::*;
#[cfg(feature = "serialize")]
use serde::{de::DeserializeOwned, Serialize};

#[cfg(feature = "serialize")]
use std::fmt::Debug;

#[cfg(feature = "serialize_rmp")]
#[test]
fn it_serializes_messagepack() {
    test_serialization::<BigTestPayload>(DynamicSerializer::Messagepack).unwrap();
    test_serialization::<AdjacentlyTaggedEnum>(DynamicSerializer::Messagepack).unwrap();
    test_serialization::<u128>(DynamicSerializer::Messagepack).unwrap();
}

#[cfg(feature = "serialize_bincode")]
#[test]
fn it_serializes_bincode() {
    test_serialization::<BigTestPayload>(DynamicSerializer::Bincode).unwrap();
    test_serialization::<AdjacentlyTaggedEnum>(DynamicSerializer::Bincode).unwrap_err();
    test_serialization::<u128>(DynamicSerializer::Bincode).unwrap();
}

#[cfg(feature = "serialize_postcard")]
#[test]
fn it_serializes_postcard() {
    test_serialization::<BigTestPayload>(DynamicSerializer::Postcard).unwrap();
    test_serialization::<AdjacentlyTaggedEnum>(DynamicSerializer::Postcard).unwrap_err();
    test_serialization::<u128>(DynamicSerializer::Postcard).unwrap();
}

#[cfg(feature = "serialize_json")]
#[test]
fn it_serializes_json() {
    test_serialization::<BigTestPayload>(DynamicSerializer::Json).unwrap();
    test_serialization::<AdjacentlyTaggedEnum>(DynamicSerializer::Json).unwrap();
    test_serialization::<u128>(DynamicSerializer::Json).unwrap();
}

#[cfg(feature = "serialize")]
fn test_serialization<D: Default + Serialize + DeserializeOwned + Clone + Eq + Debug>(
    serializer: DynamicSerializer,
) -> IPCResult<()> {
    let test_payload = SerdePayload::new(serializer, D::default());
    let payload_bytes = test_payload.clone().try_into_bytes()?;
    let payload = SerdePayload::<D>::from_payload(&payload_bytes[..])?;

    assert_eq!(payload.data(), test_payload.data());

    Ok(())
}

#[cfg(feature = "serialize")]
pub mod payload {
    use serde::{Deserialize, Serialize};
    use std::collections::HashMap;

    #[derive(Clone, Serialize, Deserialize, Eq, PartialEq, Debug)]
    pub struct BigTestPayload {
        items: Vec<u64>,
        variant: TestPayloadEnum,
        string: String,
        signed: i32,
        maps: HashMap<String, i64>,
    }

    #[derive(Clone, Serialize, Deserialize, Eq, PartialEq, Debug)]
    pub enum TestPayloadEnum {
        First,
        Second,
        Third(usize),
    }

    #[derive(Clone, Serialize, Deserialize, Eq, PartialEq, Debug)]
    #[serde(tag = "variant", content = "data")]
    pub enum AdjacentlyTaggedEnum {
        Variant1(u64),
        Variant2(String),
        Variant3(Vec<u8>),
    }

    impl Default for AdjacentlyTaggedEnum {
        fn default() -> Self {
            Self::Variant3(vec![0, 1, 2])
        }
    }

    impl Default for BigTestPayload {
        fn default() -> Self {
            let mut maps = HashMap::new();
            maps.insert("Hello".to_string(), 12);
            maps.insert("Wäüörld".to_string(), -12380);

            BigTestPayload {
                items: vec![0u64, 12452u64, u64::MAX],
                variant: TestPayloadEnum::Third(12),
                string: String::from("Hello World ſð"),
                signed: -12,
                maps,
            }
        }
    }
}
#[cfg(feature = "serialize")]
pub use payload::*;