Skip to content

Commit

Permalink
fix(rust): fixed rust namer isses, resolve google#7865 and #google#7782
Browse files Browse the repository at this point in the history
… (google#7964)

Co-authored-by: Derek Bailey <[email protected]>
  • Loading branch information
2 people authored and Jochen Parmentier committed Oct 29, 2024
1 parent 64b3707 commit 7861585
Show file tree
Hide file tree
Showing 13 changed files with 1,329 additions and 1 deletion.
6 changes: 6 additions & 0 deletions scripts/generate_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,12 @@ def glob(path, pattern):
schema="arrays_test.fbs",
)

flatc(
RUST_OPTS,
prefix="rust_namer_test",
schema="rust_namer_test.fbs",
)

flatc(
BASE_OPTS + PYTHON_OPTS,
schema="arrays_test.fbs",
Expand Down
3 changes: 2 additions & 1 deletion src/idl_namer.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,8 @@ class IdlNamer : public Namer {

std::string LegacyRustUnionTypeMethod(const FieldDef &d) {
// assert d is a union
return Method(d.name + "_type");
// d should convert case but not escape keywords due to historical reasons
return ConvertCase(d.name, config_.fields, Case::kLowerCamel) + "_type";
}

private:
Expand Down
27 changes: 27 additions & 0 deletions tests/rust_namer_test.fbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace RustNamerTest;

table FieldTable {}

union FieldUnion {
f :FieldTable (id: 0),
}

table RootTable {
field42 :FieldUnion (id: 1);
}

table PlayerStatEvent {}
table PlayerSpectate {}
table PlayerInputChange {}

union GameMessage
{
PlayerStatEvent,
PlayerSpectate,
PlayerInputChange
}

table GameMessageWrapper
{
Message:GameMessage;
}
21 changes: 21 additions & 0 deletions tests/rust_namer_test/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Automatically generated by the Flatbuffers compiler. Do not modify.
// @generated
pub mod rust_namer_test {
use super::*;
mod field_union_generated;
pub use self::field_union_generated::*;
mod game_message_generated;
pub use self::game_message_generated::*;
mod field_table_generated;
pub use self::field_table_generated::*;
mod root_table_generated;
pub use self::root_table_generated::*;
mod player_stat_event_generated;
pub use self::player_stat_event_generated::*;
mod player_spectate_generated;
pub use self::player_spectate_generated::*;
mod player_input_change_generated;
pub use self::player_input_change_generated::*;
mod game_message_wrapper_generated;
pub use self::game_message_wrapper_generated::*;
} // rust_namer_test
117 changes: 117 additions & 0 deletions tests/rust_namer_test/rust_namer_test/field_table_generated.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// automatically generated by the FlatBuffers compiler, do not modify
// @generated
extern crate alloc;
extern crate flatbuffers;
use alloc::boxed::Box;
use alloc::string::{String, ToString};
use alloc::vec::Vec;
use core::mem;
use core::cmp::Ordering;
use self::flatbuffers::{EndianScalar, Follow};
use super::*;
pub enum FieldTableOffset {}
#[derive(Copy, Clone, PartialEq)]

pub struct FieldTable<'a> {
pub _tab: flatbuffers::Table<'a>,
}

impl<'a> flatbuffers::Follow<'a> for FieldTable<'a> {
type Inner = FieldTable<'a>;
#[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
Self { _tab: flatbuffers::Table::new(buf, loc) }
}
}

impl<'a> FieldTable<'a> {

pub const fn get_fully_qualified_name() -> &'static str {
"RustNamerTest.FieldTable"
}

#[inline]
pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
FieldTable { _tab: table }
}
#[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
_fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>,
_args: &'args FieldTableArgs
) -> flatbuffers::WIPOffset<FieldTable<'bldr>> {
let mut builder = FieldTableBuilder::new(_fbb);
builder.finish()
}

pub fn unpack(&self) -> FieldTableT {
FieldTableT {
}
}
}

impl flatbuffers::Verifiable for FieldTable<'_> {
#[inline]
fn run_verifier(
v: &mut flatbuffers::Verifier, pos: usize
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
use self::flatbuffers::Verifiable;
v.visit_table(pos)?
.finish();
Ok(())
}
}
pub struct FieldTableArgs {
}
impl<'a> Default for FieldTableArgs {
#[inline]
fn default() -> Self {
FieldTableArgs {
}
}
}

pub struct FieldTableBuilder<'a: 'b, 'b> {
fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>,
start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
}
impl<'a: 'b, 'b> FieldTableBuilder<'a, 'b> {
#[inline]
pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> FieldTableBuilder<'a, 'b> {
let start = _fbb.start_table();
FieldTableBuilder {
fbb_: _fbb,
start_: start,
}
}
#[inline]
pub fn finish(self) -> flatbuffers::WIPOffset<FieldTable<'a>> {
let o = self.fbb_.end_table(self.start_);
flatbuffers::WIPOffset::new(o.value())
}
}

impl core::fmt::Debug for FieldTable<'_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let mut ds = f.debug_struct("FieldTable");
ds.finish()
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub struct FieldTableT {
}
impl Default for FieldTableT {
fn default() -> Self {
Self {
}
}
}
impl FieldTableT {
pub fn pack<'b>(
&self,
_fbb: &mut flatbuffers::FlatBufferBuilder<'b>
) -> flatbuffers::WIPOffset<FieldTable<'b>> {
FieldTable::create(_fbb, &FieldTableArgs{
})
}
}
145 changes: 145 additions & 0 deletions tests/rust_namer_test/rust_namer_test/field_union_generated.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
// automatically generated by the FlatBuffers compiler, do not modify
// @generated
extern crate alloc;
extern crate flatbuffers;
use alloc::boxed::Box;
use alloc::string::{String, ToString};
use alloc::vec::Vec;
use core::mem;
use core::cmp::Ordering;
use self::flatbuffers::{EndianScalar, Follow};
use super::*;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
pub const ENUM_MIN_FIELD_UNION: u8 = 0;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
pub const ENUM_MAX_FIELD_UNION: u8 = 1;
#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")]
#[allow(non_camel_case_types)]
pub const ENUM_VALUES_FIELD_UNION: [FieldUnion; 2] = [
FieldUnion::NONE,
FieldUnion::f,
];

#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(transparent)]
pub struct FieldUnion(pub u8);
#[allow(non_upper_case_globals)]
impl FieldUnion {
pub const NONE: Self = Self(0);
pub const f: Self = Self(1);

pub const ENUM_MIN: u8 = 0;
pub const ENUM_MAX: u8 = 1;
pub const ENUM_VALUES: &'static [Self] = &[
Self::NONE,
Self::f,
];
/// Returns the variant's name or "" if unknown.
pub fn variant_name(self) -> Option<&'static str> {
match self {
Self::NONE => Some("NONE"),
Self::f => Some("f"),
_ => None,
}
}
}
impl core::fmt::Debug for FieldUnion {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::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 FieldUnion {
type Inner = Self;
#[inline]
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
let b = flatbuffers::read_scalar_at::<u8>(buf, loc);
Self(b)
}
}

impl flatbuffers::Push for FieldUnion {
type Output = FieldUnion;
#[inline]
unsafe fn push(&self, dst: &mut [u8], _written_len: usize) {
flatbuffers::emplace_scalar::<u8>(dst, self.0);
}
}

impl flatbuffers::EndianScalar for FieldUnion {
type Scalar = u8;
#[inline]
fn to_little_endian(self) -> u8 {
self.0.to_le()
}
#[inline]
#[allow(clippy::wrong_self_convention)]
fn from_little_endian(v: u8) -> Self {
let b = u8::from_le(v);
Self(b)
}
}

impl<'a> flatbuffers::Verifiable for FieldUnion {
#[inline]
fn run_verifier(
v: &mut flatbuffers::Verifier, pos: usize
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
use self::flatbuffers::Verifiable;
u8::run_verifier(v, pos)
}
}

impl flatbuffers::SimpleToVerifyInSlice for FieldUnion {}
pub struct FieldUnionUnionTableOffset {}

#[allow(clippy::upper_case_acronyms)]
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum FieldUnionT {
NONE,
F(Box<FieldTableT>),
}
impl Default for FieldUnionT {
fn default() -> Self {
Self::NONE
}
}
impl FieldUnionT {
pub fn field_union_type(&self) -> FieldUnion {
match self {
Self::NONE => FieldUnion::NONE,
Self::F(_) => FieldUnion::f,
}
}
pub fn pack(&self, fbb: &mut flatbuffers::FlatBufferBuilder) -> Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>> {
match self {
Self::NONE => None,
Self::F(v) => Some(v.pack(fbb).as_union_value()),
}
}
/// If the union variant matches, return the owned FieldTableT, setting the union to NONE.
pub fn take_f(&mut self) -> Option<Box<FieldTableT>> {
if let Self::F(_) = self {
let v = core::mem::replace(self, Self::NONE);
if let Self::F(w) = v {
Some(w)
} else {
unreachable!()
}
} else {
None
}
}
/// If the union variant matches, return a reference to the FieldTableT.
pub fn as_f(&self) -> Option<&FieldTableT> {
if let Self::F(v) = self { Some(v.as_ref()) } else { None }
}
/// If the union variant matches, return a mutable reference to the FieldTableT.
pub fn as_f_mut(&mut self) -> Option<&mut FieldTableT> {
if let Self::F(v) = self { Some(v.as_mut()) } else { None }
}
}
Loading

0 comments on commit 7861585

Please sign in to comment.