4个版本
0.2.3 | 2023年1月16日 |
---|---|
0.2.2 | 2023年1月16日 |
0.2.0 | 2023年1月15日 |
0.1.0 | 2023年1月15日 |
在 过程宏 中排名 687
29KB
574 行
经典位字段
一个Rust crate,旨在以尽可能少的模板代码,为传统位标志/位字段值枚举提供接近的体验。
特性
- 对底层表示的解引用
- 底层表示是可定制的(即类型可以用各种大小表示;例如
u8
,i128
等) - 实现了具有自身变体的经典位操作(即
READ | WRITE & !EXECUTE
)以及与底层表示类型(即READ & !1
)的操作 - 还提供了方便的组合(
.with()
)和过滤(.without()
)方法。 - 相等和比较
- 实现了一个良好的可读性
fmt::Debug
实现方式 - 使用 serde 进行序列化和反序列化,可以是数值表示或名称列表
安装
将crate作为依赖项添加
cargo add classic-bitfield
示例
#[bitfield_enum(as u8)]
pub(crate) enum Permissions {
/// Permission to run executables or list directories
EXECUTE,
/// Permssion to write to the file
WRITE,
/// Permission to read to the file
READ,
/// COMBO
#[repr(0o6)]
READ_AND_WRITE,
}
fn main() {
let value = Permissions::all_set();
assert!(value.has_execute());
assert!(!value.has_read_and_write());
let value = value.without(Permissions::EXECUTE);
assert!(!value.has_execute());
assert!(value.has_write());
}
使用 --features=serde
(需要 serde
;示例需要 serde_json
和 serde
的 "derive"
功能)
use std::io::stdout;
use classic_bitfield::bitfield_enum;
use serde::{Deserialize, Serialize};
#[bitfield_enum(as u8)]
pub(crate) enum Permissions {
/// Permission to run executables or list directories
EXECUTE,
/// Permssion to write to the file
WRITE,
/// Permission to read to the file
READ,
/// COMBO
#[repr(0o6)]
READ_AND_WRITE,
}
use permissions_serde::numeric_representation;
#[derive(Serialize, Deserialize)]
struct FileMetadata {
#[serde(with = "numeric_representation")]
permissions: Permissions,
}
fn main() {
let stdout = stdout().lock();
let example = FileMetadata {
permissions: Permissions::READ_AND_WRITE,
};
serde_json::to_writer_pretty(stdout, &example).unwrap();
println!();
}
上述示例的输出是
{
"permissions": 6
}
为了了解您生成的类型将具备哪些功能,请查看测试用例。
限制
- 如果尝试将枚举变体命名为像常规枚举那样的驼峰式名称,您的代码检查器将正确地提出警告。这是合适的,也是期望的——位字段变体不是不同的类型,它们是常量,并且以这种方式进行样式化可以确保这一点。
- 目前能够表示的类型仅限于标准库中的有符号和无符号整数类型。如果出现使用案例,将考虑实现其他类型。
依赖项
~1.5MB
~35K SLoC