Enums 使用Rust宏转换和拆分bindgen生成的C样式枚举

Enums 使用Rust宏转换和拆分bindgen生成的C样式枚举,enums,rust,macros,ffi,rust-bindgen,Enums,Rust,Macros,Ffi,Rust Bindgen,我正在为现有的专有C库进行Rust绑定。库定义了一个相当大的枚举,其中包含可能的状态和错误代码,即: enum RET_代码 { STA_OK=0, 在某种情况下, 另一种情况, /*…更多状态代码*/ 呃!, 错误系统, 错误输入输出, /*…超过100个其他错误代码*/ }; 库函数返回这些RET\u code值。状态代码以STA开头,并不表示故障;它们发出各种条件的信号。错误代码以ERR\uu开头 我的想法是将此枚举拆分为两个Rust枚举,StatusCode和ErrorCode,如下所

我正在为现有的专有C库进行Rust绑定。库定义了一个相当大的枚举,其中包含可能的状态和错误代码,即:

enum RET_代码
{
STA_OK=0,
在某种情况下,
另一种情况,
/*…更多状态代码*/
呃!,
错误系统,
错误输入输出,
/*…超过100个其他错误代码*/
};
库函数返回这些
RET\u code
值。状态代码以
STA
开头,并不表示故障;它们发出各种条件的信号。错误代码以
ERR\uu
开头

我的想法是将此枚举拆分为两个Rust枚举,
StatusCode
ErrorCode
,如下所示:

enum StatusCode{
Ok=ffi::RET_代码::STA_Ok,
SomeCondition=ffi::RET_代码::SOME_条件,
另一个条件=ffi::RET_代码::另一个条件,
// ...
}
枚举错误代码{
内部=ffi::RET_代码::错误_内部,
系统=ffi::返回代码::错误系统,
InputOutput=ffi::RET\u代码::ERR\u输入\u输出,
// ...
}
锈包装函数将返回
std::result::result
。但是,我不想手动定义这些Rust枚举,因为C库中的状态和错误代码可能会更改,而且很可能我会忘记更新Rust绑定。修改C库不是一个选项


是否可以使用Rust宏(或其他东西)从单个C API枚举生成这些Rust枚举?重命名变体也很好(即,
STA_SOME_CONDITION
将成为
SOME CONDITION
),但这显然可以通过bindgen的
ParseCallbacks

来处理,允许手动修改bindgen的输出吗?@Shepmaster我正在使用bindgen库和build.rs。我认为手动修改输出是不可行的。如果您无法修改bindgen的输出,并且bindgen没有提供您需要的挂钩,那么您似乎没有解决方案。另请参见,通过扫描
.h
bindgen
输出以查找枚举变量,并输出
StatusCode
ErrorCode
枚举,您可以从
build.rs
生成另一个源代码。@Jmb谢谢!显然,我必须这么做。看起来我严重误解了Rust宏的本质:)