0

我正在为现有的专有 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

4

0 回答 0