我正在尝试通过编写一个简单的宏来学习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)*
};
}
一种解决方案是将相关字节存储在一个结构体中,直接实现它(或使用特性)以获取适当的字段,但这将涉及太多位移逻辑(没有问题,但必须有更方便的方法)。