Использование макросов Rust для преобразования и разделения перечисления в стиле C, созданного bindgen

Я делаю привязки Rust для существующей проприетарной библиотеки C. Библиотека определяет довольно большое перечисление, содержащее возможные коды состояния и ошибок, то есть:

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 (или что-то еще) для создания перечислений Rust из одного перечисления C API? Было бы неплохо переименовать и варианты (т.е.STA_SOME_CONDITION станет SomeCondition), но, по-видимому, это может быть обработано bindgen's ParseCallbacks.

0 ответов

Другие вопросы по тегам