serialization 0.2.12

encode and decode your struct
Documentation
#![feature(const_trait_impl)]
#![feature(generic_const_exprs)]
#![feature(specialization)]

use fastbuf::Buffer;
use serialization::{CompositeEncoder, Decode, Encode, Encoder, Serializable};
use serialization_minecraft::PacketDecoder;

pub struct TeestA {}

#[derive(Debug, Clone, Copy, Serializable)]
#[repr(u8)]
pub enum TestEnum {
    A(usize, usize) = 100,
    B = 102,
    C { value: i32 } = 105,
    D = 108,
    E = 134,
}

#[test]
fn testasdf() {
    let value = TestEnum::C { value: 123 };
    let mut buf = Buffer::<123>::new();
    let ref mut enc = serialization_minecraft::PacketEncoder::new(&mut buf);
    Encode::encode(&value, enc).unwrap();
    println!("{:?}", buf);
    let mut dec = PacketDecoder::new(&mut buf);
    let v: TestEnum = Decode::decode_placed(&mut dec).unwrap();
    println!("{v:?}");
}

pub struct TestStruct {
    v1: u8,
    v2: Option<TestStruct2>,
}

pub struct TestStruct2 {
    v1: u16,
    v2: u8,
    vec: Vec<u8>,
}

impl Encode for TestStruct {
    fn encode<E>(&self, encoder: &mut E) -> Result<(), E::Error>
    where
        E: Encoder,
    {
        let mut enc = encoder.encode_struct()?;
        enc.encode_element(&self.v1)?;
        enc.encode_element(&self.v2)?;
        enc.end()?;
        Ok(())
    }
}

impl Encode for TestStruct2 {
    fn encode<E>(&self, encoder: &mut E) -> Result<(), E::Error>
    where
        E: Encoder,
    {
        let mut enc = encoder.encode_struct()?;
        enc.encode_element(&self.v1)?;
        enc.encode_element(&self.v2)?;
        enc.encode_element(&self.vec)?;
        enc.end()?;
        Ok(())
    }
}

#[cfg(test)]
mod test {
    use crate::{TestStruct, TestStruct2};
    use fastbuf::{Buffer, ReadBuf};
    use serialization::Encode;

    #[test]
    fn test_struct() {
        let mut encoder = serialization_minecraft::PacketEncoder::new(Buffer::<255>::new());
        TestStruct {
            v1: 123,
            v2: Some(TestStruct2 {
                v1: 123,
                v2: 234,
                vec: vec![1, 2, 3],
            }),
        }
        .encode(&mut encoder)
        .unwrap();
        let data = [123, 1, 0, 123, 234, 3, 1, 2, 3];
        assert_eq!(encoder.get_continuous(data.len()), data);
    }
}

#[derive(Serializable)]
struct A {
    v1: u8,
    v2: u16,
}

#[derive(Serializable)]
struct B();

#[derive(Serializable)]
struct C(i32);