diff options
author | Casper <casperneo@uchicago.edu> | 2020-10-19 11:40:03 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-19 11:40:03 -0700 |
commit | 9fa1d27059a69149856c6e003da8c9723fec7506 (patch) | |
tree | da75d0032019f07250ebbd9ae1db0c9d82d17667 /tests/include_test | |
parent | a402b3abaea6490d8aad1fe90d8bafe2a6396fe8 (diff) | |
download | flatbuffers-9fa1d27059a69149856c6e003da8c9723fec7506.tar.gz flatbuffers-9fa1d27059a69149856c6e003da8c9723fec7506.tar.bz2 flatbuffers-9fa1d27059a69149856c6e003da8c9723fec7506.zip |
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>
Diffstat (limited to 'tests/include_test')
-rw-r--r-- | tests/include_test/include_test1_generated.rs | 1 | ||||
-rw-r--r-- | tests/include_test/sub/include_test2_generated.rs | 86 |
2 files changed, 49 insertions, 38 deletions
diff --git a/tests/include_test/include_test1_generated.rs b/tests/include_test/include_test1_generated.rs index 3c549e01..12b8b08b 100644 --- a/tests/include_test/include_test1_generated.rs +++ b/tests/include_test/include_test1_generated.rs @@ -1,6 +1,7 @@ // automatically generated by the FlatBuffers compiler, do not modify +#![allow(unused_imports, dead_code)] use crate::include_test2_generated::*; use std::mem; diff --git a/tests/include_test/sub/include_test2_generated.rs b/tests/include_test/sub/include_test2_generated.rs index a3500c97..6cfebf2b 100644 --- a/tests/include_test/sub/include_test2_generated.rs +++ b/tests/include_test/sub/include_test2_generated.rs @@ -1,6 +1,7 @@ // automatically generated by the FlatBuffers compiler, do not modify +#![allow(unused_imports, dead_code)] use crate::include_test1_generated::*; use std::mem; @@ -28,37 +29,50 @@ pub mod other_name_space { extern crate flatbuffers; use self::flatbuffers::EndianScalar; -#[allow(non_camel_case_types)] -#[repr(i64)] -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] -pub enum FromInclude { - IncludeVal = 0, - -} - +#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")] pub const ENUM_MIN_FROM_INCLUDE: i64 = 0; +#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")] pub const ENUM_MAX_FROM_INCLUDE: i64 = 0; +#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")] +#[allow(non_camel_case_types)] +pub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [ + FromInclude::IncludeVal, +]; -impl<'a> flatbuffers::Follow<'a> for FromInclude { - type Inner = Self; - #[inline] - fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { - flatbuffers::read_scalar_at::<Self>(buf, loc) +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[repr(transparent)] +pub struct FromInclude(pub i64); +#[allow(non_upper_case_globals)] +impl FromInclude { + pub const IncludeVal: Self = Self(0); + + pub const ENUM_MIN: i64 = 0; + pub const ENUM_MAX: i64 = 0; + pub const ENUM_VALUES: &'static [Self] = &[ + Self::IncludeVal, + ]; + /// Returns the variant's name or "" if unknown. + pub fn variant_name(self) -> Option<&'static str> { + match self { + Self::IncludeVal => Some("IncludeVal"), + _ => None, + } } } - -impl flatbuffers::EndianScalar for FromInclude { - #[inline] - fn to_little_endian(self) -> Self { - let n = i64::to_le(self as i64); - let p = &n as *const i64 as *const FromInclude; - unsafe { *p } +impl std::fmt::Debug for FromInclude { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + if let Some(name) = self.variant_name() { + f.write_str(name) + } else { + f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0)) + } } +} +impl<'a> flatbuffers::Follow<'a> for FromInclude { + type Inner = Self; #[inline] - fn from_little_endian(self) -> Self { - let n = i64::from_le(self as i64); - let p = &n as *const i64 as *const FromInclude; - unsafe { *p } + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self(flatbuffers::read_scalar_at::<i64>(buf, loc)) } } @@ -66,23 +80,19 @@ impl flatbuffers::Push for FromInclude { type Output = FromInclude; #[inline] fn push(&self, dst: &mut [u8], _rest: &[u8]) { - flatbuffers::emplace_scalar::<FromInclude>(dst, *self); + flatbuffers::emplace_scalar::<i64>(dst, self.0); } } -#[allow(non_camel_case_types)] -pub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [ - FromInclude::IncludeVal -]; - -#[allow(non_camel_case_types)] -pub const ENUM_NAMES_FROM_INCLUDE: [&str; 1] = [ - "IncludeVal" -]; - -pub fn enum_name_from_include(e: FromInclude) -> &'static str { - let index = e as i64; - ENUM_NAMES_FROM_INCLUDE[index as usize] +impl flatbuffers::EndianScalar for FromInclude { + #[inline] + fn to_little_endian(self) -> Self { + Self(i64::to_le(self.0)) + } + #[inline] + fn from_little_endian(self) -> Self { + Self(i64::from_le(self.0)) + } } // struct Unused, aligned to 4 |