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));