binable 0.1.0

Minimal library for encoding (decoding) types to (from) binary.
Documentation
use eyre::Result;
use generic_array::{typenum::U9, GenericArray};
use std::{io, iter::repeat_with};
use tinyvec::ArrayVec;

use crate::{impl_bin_fields, Binable};

#[derive(Debug, Default, PartialEq)]
struct Primitives {
    uints: (u8, u16, u32, u64, u128),
    ints: (i8, i16, i32, i64, i128),
    floats: (f32, f64),
}

impl Primitives {
    fn rand() -> Self {
        Primitives {
            uints: (
                fastrand::u8(..),
                fastrand::u16(..),
                fastrand::u32(..),
                fastrand::u64(..),
                fastrand::u128(..),
            ),
            ints: (
                fastrand::i8(..),
                fastrand::i16(..),
                fastrand::i32(..),
                fastrand::i64(..),
                fastrand::i128(..),
            ),
            floats: (fastrand::f32(), fastrand::f64()),
        }
    }
}

impl Binable for Primitives {
    impl_bin_fields! {uints, ints, floats}
}

#[test]
fn primitives() -> Result<()> {
    let prims: Vec<_> = repeat_with(|| Primitives::rand()).take(9).collect();
    let mut buf = io::Cursor::new(Vec::new());
    prims.encode_into(&mut buf)?;
    buf.set_position(0);
    assert_eq!(prims, Vec::<_>::decode_from(&mut buf)?);
    Ok(())
}

#[test]
fn tinyvec() -> Result<()> {
    let prims: ArrayVec<[Primitives; 9]> = repeat_with(|| Primitives::rand()).take(9).collect();
    let mut buf = io::Cursor::new(Vec::new());
    prims.encode_into(&mut buf)?;
    buf.set_position(0);
    assert_eq!(prims, ArrayVec::decode_from(&mut buf)?);
    Ok(())
}

#[test]
fn genarr() -> Result<()> {
    let prims: GenericArray<Primitives, U9> = repeat_with(|| Primitives::rand()).take(9).collect();
    let mut buf = io::Cursor::new(Vec::new());
    prims.encode_into(&mut buf)?;
    buf.set_position(0);
    assert_eq!(prims, GenericArray::decode_from(&mut buf)?);
    Ok(())
}