le-stream-derive 1.3.10

Derive macros to de-/serialize objects from/to little endian byte streams
Documentation

le-stream-derive

Derive macros for le-stream.

The crate provides FromLeStream and ToLeStream derives for structs and represented enums.

Structs

Struct fields are serialized in declaration order.

use le_stream::{FromLeStream, ToLeStream};

#[derive(Clone, Debug, Eq, PartialEq, FromLeStream, ToLeStream)]
struct Header {
    command: u8,
    sequence: u16,
}

let header = Header {
    command: 0xA5,
    sequence: 0x1234,
};

let bytes: Vec<_> = header.clone().to_le_stream().collect();
assert_eq!(bytes, [0xA5, 0x34, 0x12]);
assert_eq!(Header::from_le_stream_exact(bytes.into_iter()), Ok(header));

Enums

Enums must specify #[repr(T)], and every variant must have an explicit discriminant. The discriminant is serialized as T, followed by any associated data.

use le_stream::{FromLeStream, ToLeStream};

#[derive(Clone, Debug, Eq, PartialEq, FromLeStream, ToLeStream)]
#[repr(u16)]
enum Message {
    Ping = 0x0001,
    Data { sequence: u16, value: u8 } = 0x1002,
}

let message = Message::Data {
    sequence: 0x1234,
    value: 0xA5,
};

let bytes: Vec<_> = message.clone().to_le_stream().collect();
assert_eq!(bytes, [0x02, 0x10, 0x34, 0x12, 0xA5]);
assert_eq!(Message::from_le_stream_exact(bytes.into_iter()), Ok(message));