我正在为现有的专有 C 库制作 Rust 绑定。该库定义了一个相当大的枚举,其中包含可能的状态和错误代码,即:
enum RET_CODE
{
STA_OK = 0,
STA_SOME_CONDITION,
STA_ANOTHER_CONDITION,
/* ... more status codes ... */
ERR_INTERNAL,
ERR_SYSTEM,
ERR_INPUT_OUTPUT,
/* ... more than 100 other error codes ... */
};
库函数返回这些RET_CODE
值。状态码开头STA_
并不意味着失败;它们表示各种情况。错误代码以ERR_
.
我的想法是将这个枚举分成两个 Rust 枚举,StatusCode
并且ErrorCode
,就像这样:
enum StatusCode {
Ok = ffi::RET_CODE::STA_OK,
SomeCondition = ffi::RET_CODE::SOME_CONDITION,
AnotherCondition = ffi::RET_CODE::ANOTHER_CONDITION,
// ...
}
enum ErrorCode {
Internal = ffi::RET_CODE::ERR_INTERNAL,
System = ffi::RET_CODE::ERR_SYSTEM,
InputOutput = ffi::RET_CODE::ERR_INPUT_OUTPUT,
// ...
}
然后, Rust 包装器函数将返回std::result::Result<StatusCode, ErrorCode>
. 但是,我不想手动定义那些 Rust 枚举,因为 C 库中的状态和错误代码可能会发生变化,而且我很可能会忘记更新 Rust 绑定。修改 C 库不是一种选择。
是否可以使用 Rust 宏(或其他东西)从单个 C API 枚举中生成这些 Rust 枚举?也可以重命名变体(即STA_SOME_CONDITION
变为SomeCondition
),但这显然可以由 bindgen 处理ParseCallbacks
。