> A Rust enum isn't even "quite close" to a C enum
This is incorrect. The following Rust enum compiles down to a single byte, whose variants are represented by the numbers 0, 1, and 2:
enum Foo {
Zero,
One,
Two
}
You can even give them all numeric values explicitly:
enum Bar {
Ten = 10,
Eighty = 80,
TwoHundred = 200
}
And you can also just tell it where to start and let it count from there:
enum Qux {
Five = 5,
Six,
Seven
}
If you throw the #[repr(C)] attribute on any of these then Rust will make sure to size them as C would on your particular platform (on my machine this attribute inflates them from 8 bits to 64 bits), making them usable directly from C as well.