binprot 0.1.7

Rust implementation of the bin_prot protocol.
Documentation
use binprot::macros::{BinProtRead, BinProtWrite};
use std::fmt::Debug;

#[cfg(feature = "async")]
use binprot::BinProtWrite;

#[derive(BinProtRead, BinProtWrite, Clone, Debug, PartialEq)]
struct Pancakes(i64);

#[derive(BinProtRead, BinProtWrite, Clone, Debug, PartialEq)]
struct MorePancakes(i64, f64, i64);

#[derive(BinProtRead, BinProtWrite, Clone, Debug, PartialEq)]
struct Breakfasts {
    pancakes: Pancakes,
    more_pancakes: MorePancakes,
    value1: i64,
    value2: (f64, f64),
}

#[cfg(feature = "async")]
async fn roundtrip<
    T: 'static + Clone + BinProtRead + BinProtWrite + PartialEq + Debug + Send + Sync,
>(
    vs: &[T],
) -> Result<(), binprot::Error> {
    let (mut client, mut server) = tokio::io::duplex(1);
    let mut vs_for_spawn = vec![];
    vs_for_spawn.extend_from_slice(vs);
    tokio::spawn(async move {
        let mut buffer = binprot::async_read_write::AsyncBuffer::new(1);
        for v in vs_for_spawn.iter() {
            buffer.write_with_size(&mut client, v).await.unwrap();
        }
    });
    let mut buffer = binprot::async_read_write::AsyncBuffer::new(1);
    for v in vs.iter() {
        let w = buffer.read_with_size(&mut server).await?;
        assert_eq!(*v, w);
    }
    Ok(())
}

#[cfg(feature = "async")]
#[tokio::test]
async fn roundtrip_test() -> Result<(), binprot::Error> {
    roundtrip(&vec![Pancakes(42); 100]).await?;
    roundtrip(&vec![Pancakes(42), Pancakes(43), Pancakes(44)]).await?;
    let breakfasts = Breakfasts {
        pancakes: Pancakes(12),
        more_pancakes: MorePancakes(-123, 2.71828182846, 0),
        value1: -1234567890123456,
        value2: (3.141592, 6535.8979),
    };
    roundtrip(&vec![breakfasts; 100]).await?;
    Ok(())
}