Использование макросов 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
.