Rework enums in rust. (#6098)

* Rework enums in rust.

They're now a unit struct, rather than an enum. This is a
backwards incompatible change but the previous version had UB
and was also backwards incompatible so...

* Update and test sample rust flatbuffers

* Use bitflags crate to properly support rust enums.

Previously, the bitflags attribute was just ignored. This is a breaking change
as the bitflgs API is not like a normal rust enum (duh).

* variant_name() -> Option<_>

* repr transparent

* Reexport bitflags from flatbuffers

* Make bitflags constants CamelCase, matching normal enums

* Deprecate c-style associated enum constants

Co-authored-by: Casper Neo <cneo@google.com>
This commit is contained in:
Casper
2020-10-19 11:40:03 -07:00
committed by GitHub
parent a402b3abae
commit 9fa1d27059
13 changed files with 724 additions and 628 deletions

View File

@@ -32,6 +32,11 @@ path = "../../samples/sample_flexbuffers.rs"
name = "sample_flexbuffers_serde"
path = "../../samples/sample_flexbuffers_serde.rs"
[[bin]]
name = "sample_flatbuffers"
path = "../../samples/sample_binary.rs"
[dev-dependencies]
quickcheck = "0.6"
# TODO(rw): look into moving to criterion.rs

View File

@@ -29,15 +29,12 @@ extern crate quickcheck_derive;
mod flexbuffers_tests;
mod optional_scalars_test;
#[allow(dead_code, unused_imports)]
#[path = "../../include_test/include_test1_generated.rs"]
pub mod include_test1_generated;
#[allow(dead_code, unused_imports)]
#[path = "../../include_test/sub/include_test2_generated.rs"]
pub mod include_test2_generated;
#[allow(dead_code, unused_imports)]
#[path = "../../monster_test_generated.rs"]
mod monster_test_generated;
pub use monster_test_generated::my_game;
@@ -265,83 +262,41 @@ mod generated_constants {
#[test]
fn enum_constants_are_public() {
assert_eq!(1, my_game::example::ENUM_MIN_COLOR);
assert_eq!(8, my_game::example::ENUM_MAX_COLOR);
assert_eq!(my_game::example::ENUM_VALUES_COLOR, [
my_game::example::Color::Red,
my_game::example::Color::Green,
my_game::example::Color::Blue,
]);
assert_eq!(my_game::example::ENUM_NAMES_COLOR, [
"Red",
"Green",
"",
"",
"",
"",
"",
"Blue"
]);
assert_eq!(-1, my_game::example::ENUM_MIN_RACE);
assert_eq!(2, my_game::example::ENUM_MAX_RACE);
assert_eq!(my_game::example::ENUM_VALUES_RACE, [
assert_eq!(-1, my_game::example::Race::ENUM_MIN);
assert_eq!(2, my_game::example::Race::ENUM_MAX);
assert_eq!(my_game::example::Race::ENUM_VALUES, [
my_game::example::Race::None,
my_game::example::Race::Human,
my_game::example::Race::Dwarf,
my_game::example::Race::Elf,
]);
assert_eq!(my_game::example::ENUM_NAMES_RACE, [
"None",
"Human",
"Dwarf",
"Elf"
]);
assert_eq!(0, my_game::example::ENUM_MIN_ANY);
assert_eq!(3, my_game::example::ENUM_MAX_ANY);
assert_eq!(my_game::example::ENUM_VALUES_ANY, [
assert_eq!(0, my_game::example::Any::ENUM_MIN);
assert_eq!(3, my_game::example::Any::ENUM_MAX);
assert_eq!(my_game::example::Any::ENUM_VALUES, [
my_game::example::Any::NONE,
my_game::example::Any::Monster,
my_game::example::Any::TestSimpleTableWithEnum,
my_game::example::Any::MyGame_Example2_Monster,
]);
assert_eq!(my_game::example::ENUM_NAMES_ANY, [
"NONE",
"Monster",
"TestSimpleTableWithEnum",
"MyGame_Example2_Monster"
]);
assert_eq!(0, my_game::example::ENUM_MIN_ANY_UNIQUE_ALIASES);
assert_eq!(3, my_game::example::ENUM_MAX_ANY_UNIQUE_ALIASES);
assert_eq!(my_game::example::ENUM_VALUES_ANY_UNIQUE_ALIASES, [
assert_eq!(0, my_game::example::AnyUniqueAliases::ENUM_MIN);
assert_eq!(3, my_game::example::AnyUniqueAliases::ENUM_MAX);
assert_eq!(my_game::example::AnyUniqueAliases::ENUM_VALUES, [
my_game::example::AnyUniqueAliases::NONE,
my_game::example::AnyUniqueAliases::M,
my_game::example::AnyUniqueAliases::TS,
my_game::example::AnyUniqueAliases::M2,
]);
assert_eq!(my_game::example::ENUM_NAMES_ANY_UNIQUE_ALIASES, [
"NONE",
"M",
"TS",
"M2"
]);
assert_eq!(0, my_game::example::ENUM_MIN_ANY_AMBIGUOUS_ALIASES);
assert_eq!(3, my_game::example::ENUM_MAX_ANY_AMBIGUOUS_ALIASES);
assert_eq!(my_game::example::ENUM_VALUES_ANY_AMBIGUOUS_ALIASES, [
assert_eq!(0, my_game::example::AnyAmbiguousAliases::ENUM_MIN);
assert_eq!(3, my_game::example::AnyAmbiguousAliases::ENUM_MAX);
assert_eq!(my_game::example::AnyAmbiguousAliases::ENUM_VALUES, [
my_game::example::AnyAmbiguousAliases::NONE,
my_game::example::AnyAmbiguousAliases::M1,
my_game::example::AnyAmbiguousAliases::M2,
my_game::example::AnyAmbiguousAliases::M3,
]);
assert_eq!(my_game::example::ENUM_NAMES_ANY_AMBIGUOUS_ALIASES, [
"NONE",
"M1",
"M2",
"M3"
]);
}
}
@@ -732,19 +687,18 @@ mod roundtrip_generated_code {
test4: Some(v), ..Default::default()});
assert_eq!(m.test4().unwrap(), &[my_game::example::Test::new(127, -128), my_game::example::Test::new(3, 123), my_game::example::Test::new(100, 101)][..]);
}
// TODO(rw) this passes, but I don't want to change the monster test schema right now
// #[test]
// fn vector_of_enum_store() {
// let mut b = flatbuffers::FlatBufferBuilder::new();
// let v = b.create_vector::<my_game::example::Color>(&[my_game::example::Color::Red, my_game::example::Color::Green][..]);
// let name = b.create_string("foo");
// let m = build_mon(&mut b, &my_game::example::MonsterArgs{
// name: Some(name),
// vector_of_enum: Some(v), ..Default::default()});
// assert_eq!(m.vector_of_enum().unwrap().len(), 2);
// assert_eq!(m.vector_of_enum().unwrap().get(0), my_game::example::Color::Red);
// assert_eq!(m.vector_of_enum().unwrap().get(1), my_game::example::Color::Green);
// }
#[test]
fn vector_of_enums_store() {
let mut b = flatbuffers::FlatBufferBuilder::new();
let v = b.create_vector::<my_game::example::Color>(&[my_game::example::Color::Red, my_game::example::Color::Green][..]);
let name = b.create_string("foo");
let m = build_mon(&mut b, &my_game::example::MonsterArgs{
name: Some(name),
vector_of_enums: Some(v), ..Default::default()});
assert_eq!(m.vector_of_enums().unwrap().len(), 2);
assert_eq!(m.vector_of_enums().unwrap().get(0), my_game::example::Color::Red);
assert_eq!(m.vector_of_enums().unwrap().get(1), my_game::example::Color::Green);
}
#[test]
fn vector_of_table_store() {
let b = &mut flatbuffers::FlatBufferBuilder::new();