For context: I am trying to write a Rust wrapper over a C library.
Like many C libraries, most of its functions return an int
. Positive return values are meaningful (provides information) and negative values are error codes.
To give an example, think of something like int get_items_from_record(const struct record *rec, struct item *items)
. A positive value indicates how many items were returned. -1
could mean ErrorA, -2
ErrorB, and so on.
Since this is Rust, I want to represent this kind of integer as Result<T, E>, e.g.:
enum LibError {
A = -1,
B = -2,
// ....
}
// LibResult is ideally just represented as an integer.
type LibResult = Result<NonNegativeInteger, LibError>;
// Then I can pass LibResult values back to the C code as i32 trivially.
Is there a way/crate to do this?
The reason I asked the question, was that I wanted to keep an
int
anint
throughout the program.It’s not for performance reasons, it’s just that I feel like there is a certain elegance in keeping things type safe entirely “for free” much like how
Option<&T>
is actually just a regularT*
, even if it could be pointless in the big picture.