1个不稳定版本

使用旧Rust 2015

0.3.0 2016年8月11日

24#tagged

MIT 许可证

11KB
169

同大小标签数据结构转换

此crate提供了一些样板宏,以实现具有内置判别字段的联合类型之间的转换。例如,一个由多个数据包类型组成的网络协议,其中每个数据包类型由结构体中的字段指示。

#[repr(C)]
pub struct Packet {
    packet_type: u8,
    // an unknown (depends on packet type) payload
    data: [u8; 7],
}

#[repr(C)]
pub struct StatusPacket {
    /// must be 0x02 for a status packet
    packet_type: u8,
    status_0: u8,
    status_1: u8,
    status_2: u8,
    ts: [u8; 4],
}

#[macro_use]
extern crate pcast;

pub enum ConversionError {
    WrongPacketType
}

subtype_of!(Packet => StatusPacket | ConversionError {
    Ok(())
});

StatusPacket有三个字段用于各种标志和一个四字节的时戳;其存在由packet_type中的0x02值指示。

现在可以使用subtype_of宏来声明这一点。因此,可以将Packet尝试转换为StatusPacket,并传递引用,因为&Span>&StatusPacket将Deref到&Span>&Packet。

不包括从&Span>&mut StatusPacket到&Span>&mut Packet的转换,因为修改Packet结构可能会违反StatusPacket所需的不变量。

依赖关系

~15KB