6 releases
0.0.5 | Jun 14, 2022 |
---|---|
0.0.4 | Dec 1, 2021 |
0.0.3-dev | Nov 30, 2021 |
0.0.2-dev | Nov 30, 2021 |
0.0.1-dev | Nov 30, 2021 |
#1643 in Procedural macros
16KB
250 lines
byteme
A proc-macro
to convert a struct into Vec and back by implemeting From
trait on the struct.
The conversion is Big Endian by default.
We have made the following assumptions about the the struct:
- The struct must have fields.
- The fields are public.
- The fields have the following types
u8
u16
u32
u64
u128
usize
[u8; N]
- an enum
- For enum, we must attach a
#[byte_me($size)]
attribute, where size is any of the positive integer types. - The enum declration must have
#[derive(FromPrimitive)]
from thenum-derive
crate.
The num-derive
crate is required to generate the FromPrimitive
trait for enums. Having said that, the same
functionality can be achieved using num-enum
crate. It provides furthur control over the enum data types,
and might prove handy. here is the discussion
on the topic.
Example
use byteme::ByteMe;
pub use num_derive::FromPrimitive;
#[derive(Debug, FromPrimitive)]
pub enum Mode {
Unavailable = 0,
Unauthenticated = 1,
Authenticated = 2,
Encrypted = 4,
}
#[derive(ByteMe, Debug)]
pub struct FrameOne {
pub unused: [u8; 12],
#[byte_me(u32)]
pub mode: Mode,
pub challenge: [u8; 16],
pub salt: [u8; 16],
pub count: u32,
pub mbz: [u8; 12],
};
let frame = FrameOne {
unused: [0; 12],
mode: Mode::Authenticated,
challenge: [0; 16],
salt: [0; 16],
count: 1024,
mbz: [0; 12],
};
let size = FrameOne::SIZE; // Get the number of bytes in the frame
let bytes: Vec<u8> = frame.into(); // Converts the frame into vector of bytes
let frame: FrameOne = bytes.into(); // Converts the bytes back to frame
License: Apache-2.0
Dependencies
~1.5MB
~39K SLoC