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

GPL-3.0 许可证

29KB
574

经典位字段

一个Rust crate,旨在以尽可能少的模板代码,为传统位标志/位字段值枚举提供接近的体验。

特性

  • 对底层表示的解引用
  • 底层表示是可定制的(即类型可以用各种大小表示;例如 u8i128 等)
  • 实现了具有自身变体的经典位操作(即 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_jsonserde"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