packtool 0.4.0

In memory packing made easy
Documentation
use packtool::{Packed, View};

#[derive(Debug, PartialEq, Eq, Packed)]
#[packed(value = b"tuple")]
struct TagTuple();

#[derive(Debug, PartialEq, Eq, Packed)]
#[packed(value = b"struct")]
struct TagStruct {}

#[derive(Debug, PartialEq, Eq, Packed)]
struct Tuple1(u8);

#[derive(Debug, PartialEq, Eq, Packed)]
struct Tuple2(u32, u16);

#[derive(Debug, PartialEq, Eq, Packed)]
struct Tuple3(TagStruct, TagStruct, TagTuple);

#[derive(Debug, PartialEq, Eq, Packed)]
struct Struct2 {
    tag: TagStruct,
    value: u16,
}

macro_rules! internal_mk_test {
    ($Type:ty => ($cstr:expr_2021, $SLICE:expr_2021)) => {{
        let view = View::<$Type>::try_from_slice($SLICE).unwrap();
        let object: $Type = view.unpack();
        assert_eq!(object, $cstr);

        let mut slice = [0u8; <$Type as Packed>::SIZE];
        ($cstr).unchecked_write_to_slice(&mut slice);
        assert_eq!($SLICE, &slice);
    }};
    ($Type:ty => ( $SLICE:expr_2021 )) => {{
        let _err = View::<$Type>::try_from_slice($SLICE).unwrap_err();
    }};
}

#[test]
fn tuple1() {
    internal_mk_test!(Tuple1 => ( Tuple1(0), &[0u8]));
    internal_mk_test!(Tuple1 => ( Tuple1(42), &[42u8]));

    internal_mk_test!(Tuple1 => ( &[0u8; 2]));
}

#[test]
fn tuple2() {
    internal_mk_test!(Tuple2 => ( Tuple2(0xFF, 0), &[0xFFu8, 0, 0, 0, 0, 0]));
}

#[test]
fn tuple3() {
    internal_mk_test!(Tuple3 => (
        Tuple3(TagStruct {}, TagStruct {}, TagTuple ()),
        b"structstructtuple")
    );
}

#[test]
fn struct2() {
    internal_mk_test!(Struct2 => (
        Struct2  {
            tag: TagStruct {},
            value: 42,
        },
        b"struct\x2a\x00")
    );
}