#proc-macro #c #no-std

nightly macro no-std c_defines_to_enum

用于从C定义语句生成枚举的过程宏

1个不稳定版本

0.1.1 2024年4月7日
0.1.0 2024年4月3日

#1275 in 过程宏

MIT许可证

11KB
202

C Defines To Enum

将C风格的#define语句转换为Rust中的enum

使用方法

提供确切的枚举名称。以及具有名称content的字符串字面量,用于从C定义生成枚举。

内容可以通过宏如include_str!进行评估。

此库旨在在no_std环境下使用。

use c_defines_to_enum::parse_c_defines_to_enum;
use std::convert::TryFrom;

parse_c_defines_to_enum!(
            TestEnum,
            to_lower = true,
            content = include_str!("test.h")
        );

fn it_works() {
    println!("{:?}", TestEnum::try_from(1234));
    let value: usize = TestEnum::test1.into();
    println!("{:?} = {}", TestEnum::test1, value);
}

结果

Ok(test1)
test1 = 1234

支持属性

  • to_lower
    • bool,将C定义的名称转换为小写。
  • to_upper
    • bool,将C定义的名称转换为大写。
  • remove_prefix
    • str,删除C定义名称的前缀。
  • remove_suffix
    • str,删除C定义名称的后缀。

已知问题

  • 不支持级联前向如
#define A B
#define B 1000
  • 如果检测到任何重复的值,Rust将不会按实际值存储枚举。您应使用Into<usize>的特性。
  • #[repr(usize)]TryFrom<usize>/Into<usize>已修复。
  • 生成的枚举始终为pub

依赖关系

~1.5MB
~35K SLoC