我正在尝试通过编写一个简单的宏来学习 Rust 宏系统,该宏基于一些无符号整数类型 ( u8
, u16
, u32
, u64
) 生成一个结构。我想要这样的东西:
bitmessage! {
struct Header(u16);
version: 8, 5; // the first number is the length, second is value
data: 8, 5;
}
更具体地说,我正在寻找某种方法将某些信息存储在具有各种偏移量的无符号整数类型中。一个用例是读取一些字节并构造某种“消息”:
[ 15 14 13 12 11 10 09 08 | 07 06 05 04 03 02 01 01 ]
消息的上半部分包含一些数据/信息,下半部分是版本控制字段。(这只是一个玩具示例)。
到目前为止,这是我的努力,但内部重复扩展无法编译:
macro_rules! bitmessage {
(struct $name:ident($n:ty);
$($field_name:ident: $length:expr, $value:expr;)*) => {
struct $name ($n);
$($name.1 = $name.1 | $value << $length)*
};
}
一种解决方案可能是将相关字节存储在结构中,直接(或使用特征)实现它以获取适当的字段,但这会涉及太多的位移逻辑(没问题,但必须有更多方便的方式)。