diff options
author | Max Burke <max@urbanlogiq.com> | 2022-01-30 16:29:18 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-30 19:29:18 -0500 |
commit | 1d294a31b8058211fb13bbb6c32c7ed414b6272a (patch) | |
tree | 5a3454fbff8ef86361a7539005471d296ea205fb | |
parent | dd8fccfb1b7a6102de56e07f4adb4a74c925540e (diff) | |
download | flatbuffers-1d294a31b8058211fb13bbb6c32c7ed414b6272a.tar.gz flatbuffers-1d294a31b8058211fb13bbb6c32c7ed414b6272a.tar.bz2 flatbuffers-1d294a31b8058211fb13bbb6c32c7ed414b6272a.zip |
Implement Serialize on generated rust types (#7022)
* fix for rust build
* Rust: Implement Serialize on generated types
For debugging convenience it is really handy to be able to dump out
types as another format (ie: json). For example, if we are logging a
type to a structured logging system, or even printing it out in a
structured way to the console.
Right now we handle this by shelling out to `flatc` which is not ideal;
by implementing Serialize on the generated types we can use any of the
Serializer-implementing packages for our structured debug output.
* clang-format
* Make the flatbuffers Rust crate only have an optional dependency on the `serde` packages.
* fix warning
* fix rust test build
* Oh yeah this needs to be initialized
* fix toml syntax
* code review feedback
* rebuild test data
67 files changed, 5455 insertions, 1 deletions
diff --git a/include/flatbuffers/idl.h b/include/flatbuffers/idl.h index 1be07953..039e3c5d 100644 --- a/include/flatbuffers/idl.h +++ b/include/flatbuffers/idl.h @@ -626,6 +626,9 @@ struct IDLOptions { // If set, require all fields in a table to be explicitly numbered. bool require_explicit_ids; + // If set, implement serde::Serialize for generated Rust types + bool rust_serialize; + // The corresponding language bit will be set if a language is included // for code generation. unsigned long lang_to_generate; @@ -690,6 +693,7 @@ struct IDLOptions { json_nested_legacy_flatbuffers(false), mini_reflect(IDLOptions::kNone), require_explicit_ids(false), + rust_serialize(false), lang_to_generate(0), set_empty_strings_to_null(true), set_empty_vectors_to_null(true) {} diff --git a/rust/flatbuffers/Cargo.toml b/rust/flatbuffers/Cargo.toml index ebe8a880..f1826049 100644 --- a/rust/flatbuffers/Cargo.toml +++ b/rust/flatbuffers/Cargo.toml @@ -14,10 +14,12 @@ rust = "1.51" [features] default = ["thiserror"] no_std = ["core2", "thiserror_core2"] +serialize = ["serde"] [dependencies] smallvec = "1.6.1" bitflags = "1.2.1" +serde = { version = "1.0", optional = true } thiserror = { version = "1.0.23", optional = true } core2 = { version = "0.3.3", optional = true } thiserror_core2 = { git = "https://github.com/antmicro/thiserror-core2.git", branch = "remaining-errors", optional = true } diff --git a/rust/flatbuffers/src/array.rs b/rust/flatbuffers/src/array.rs index 3765a5fc..91aadec9 100644 --- a/rust/flatbuffers/src/array.rs +++ b/rust/flatbuffers/src/array.rs @@ -133,3 +133,22 @@ where array.assume_init() } } + +#[cfg(feature="serialize")] +impl<'a, T: 'a, const N: usize> serde::ser::Serialize for Array<'a, T, N> +where + T: 'a + Follow<'a>, + <T as Follow<'a>>::Inner: serde::ser::Serialize, +{ + fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> + where + S: serde::ser::Serializer, + { + use serde::ser::SerializeSeq; + let mut seq = serializer.serialize_seq(Some(self.len()))?; + for element in self.iter() { + seq.serialize_element(&element)?; + } + seq.end() + } +} diff --git a/rust/flatbuffers/src/vector.rs b/rust/flatbuffers/src/vector.rs index eb6dd15e..bd1d5591 100644 --- a/rust/flatbuffers/src/vector.rs +++ b/rust/flatbuffers/src/vector.rs @@ -308,3 +308,22 @@ impl<'a, 'b, T: Follow<'a> + 'a> IntoIterator for &'b Vector<'a, T> { self.iter() } } + +#[cfg(feature="serialize")] +impl<'a, T> serde::ser::Serialize for Vector<'a, T> +where + T: 'a + Follow<'a>, + <T as Follow<'a>>::Inner: serde::ser::Serialize, +{ + fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> + where + S: serde::ser::Serializer, + { + use serde::ser::SerializeSeq; + let mut seq = serializer.serialize_seq(Some(self.len()))?; + for element in self { + seq.serialize_element(&element)?; + } + seq.end() + } +} diff --git a/samples/rust_generated/my_game/sample/monster_generated.rs b/samples/rust_generated/my_game/sample/monster_generated.rs index d8988321..c156225f 100644 --- a/samples/rust_generated/my_game/sample/monster_generated.rs +++ b/samples/rust_generated/my_game/sample/monster_generated.rs @@ -205,6 +205,7 @@ impl<'a> Default for MonsterArgs<'a> { } } } + pub struct MonsterBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/samples/rust_generated/my_game/sample/vec_3_generated.rs b/samples/rust_generated/my_game/sample/vec_3_generated.rs index 33805b3f..a1647d5d 100644 --- a/samples/rust_generated/my_game/sample/vec_3_generated.rs +++ b/samples/rust_generated/my_game/sample/vec_3_generated.rs @@ -70,6 +70,7 @@ impl<'a> flatbuffers::Verifiable for Vec3 { v.in_buffer::<Self>(pos) } } + impl<'a> Vec3 { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/samples/rust_generated/my_game/sample/weapon_generated.rs b/samples/rust_generated/my_game/sample/weapon_generated.rs index e2cede9d..50a678b6 100644 --- a/samples/rust_generated/my_game/sample/weapon_generated.rs +++ b/samples/rust_generated/my_game/sample/weapon_generated.rs @@ -89,6 +89,7 @@ impl<'a> Default for WeaponArgs<'a> { } } } + pub struct WeaponBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/scripts/generate_code.py b/scripts/generate_code.py index 7902f0ed..5420ed9e 100755 --- a/scripts/generate_code.py +++ b/scripts/generate_code.py @@ -103,6 +103,7 @@ CPP_17_OPTS = NO_INCL_OPTS + [ "--gen-object-api", ] RUST_OPTS = BASE_OPTS + ["--rust", "--gen-all", "--gen-name-strings"] +RUST_SERIALIZE_OPTS = BASE_OPTS + ["--rust", "--gen-all", "--gen-name-strings", "--rust-serialize"] TS_OPTS = ["--ts", "--gen-name-strings"] LOBSTER_OPTS = ["--lobster"] SWIFT_OPTS = ["--swift", "--gen-json-emit", "--bfbs-filenames", str(tests_path)] @@ -156,6 +157,14 @@ flatc( ) flatc( + RUST_SERIALIZE_OPTS, + schema="monster_test.fbs", + include="include_test", + prefix="monster_test_serialize", + data="monsterdata_test.json", +) + +flatc( options=BASE_OPTS + ["--python"], schema="monster_test.fbs", include="include_test", diff --git a/src/flatc.cpp b/src/flatc.cpp index 7c16abe2..1437eb4c 100644 --- a/src/flatc.cpp +++ b/src/flatc.cpp @@ -184,6 +184,7 @@ const static FlatCOption options[] = { { "", "reflect-types", "", "Add minimal type reflection to code generation." }, { "", "reflect-names", "", "Add minimal type/name reflection." }, + { "", "rust-serialize", "", "Implement serde::Serialize on generated Rust types." }, { "", "root-type", "T", "Select or override the default root_type." }, { "", "require-explicit-ids", "", "When parsing schemas, require explicit ids (id: x)." }, @@ -469,6 +470,8 @@ int FlatCompiler::Compile(int argc, const char **argv) { opts.mini_reflect = IDLOptions::kTypes; } else if (arg == "--reflect-names") { opts.mini_reflect = IDLOptions::kTypesAndNames; + } else if (arg == "--rust-serialize") { + opts.rust_serialize = true; } else if (arg == "--require-explicit-ids") { opts.require_explicit_ids = true; } else if (arg == "--root-type") { diff --git a/src/idl_gen_rust.cpp b/src/idl_gen_rust.cpp index 813a4c19..d4cb3127 100644 --- a/src/idl_gen_rust.cpp +++ b/src/idl_gen_rust.cpp @@ -384,6 +384,11 @@ class RustGenerator : public BaseGenerator { code_ += "extern crate flatbuffers;"; code_ += "use std::mem;"; code_ += "use std::cmp::Ordering;"; + if (parser_.opts.rust_serialize) { + code_ += "extern crate serde;"; + code_ += + "use self::serde::ser::{Serialize, Serializer, SerializeStruct};"; + } code_ += "use self::flatbuffers::{EndianScalar, Follow};"; code_ += "use super::*;"; cur_name_space_ = symbol.defined_namespace; @@ -842,6 +847,26 @@ class RustGenerator : public BaseGenerator { code_.SetValue("INTO_BASE", "self.0"); } + // Implement serde::Serialize + if (parser_.opts.rust_serialize) { + code_ += "impl Serialize for {{ENUM_NAME}} {"; + code_ += + " fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>"; + code_ += " where"; + code_ += " S: Serializer,"; + code_ += " {"; + if (IsBitFlagsEnum(enum_def)) { + code_ += " serializer.serialize_u32(self.bits() as u32)"; + } else { + code_ += + " serializer.serialize_unit_variant(\"{{ENUM_NAME}}\", self.0 as " + "u32, self.variant_name().unwrap())"; + } + code_ += " }"; + code_ += "}"; + code_ += ""; + } + // Generate Follow and Push so we can serialize and stuff. code_ += "impl<'a> flatbuffers::Follow<'a> for {{ENUM_NAME}} {"; code_ += " type Inner = Self;"; @@ -2005,6 +2030,74 @@ class RustGenerator : public BaseGenerator { code_ += " }"; code_ += " }"; code_ += "}"; + code_ += ""; + + // Implement serde::Serialize + if (parser_.opts.rust_serialize) { + const auto numFields = struct_def.fields.vec.size(); + code_.SetValue("NUM_FIELDS", NumToString(numFields)); + code_ += "impl Serialize for {{STRUCT_NAME}}<'_> {"; + code_ += + " fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>"; + code_ += " where"; + code_ += " S: Serializer,"; + code_ += " {"; + if (numFields == 0) { + code_ += + " let s = serializer.serialize_struct(\"{{STRUCT_NAME}}\", 0)?;"; + } else { + code_ += + " let mut s = serializer.serialize_struct(\"{{STRUCT_NAME}}\", " + "{{NUM_FIELDS}})?;"; + } + ForAllTableFields(struct_def, [&](const FieldDef &field) { + const Type &type = field.value.type; + if (IsUnion(type)) { + if (type.base_type == BASE_TYPE_UNION) { + const auto &enum_def = *type.enum_def; + code_.SetValue("ENUM_NAME", WrapInNameSpace(enum_def)); + code_.SetValue("FIELD_TYPE_FIELD_NAME", field.name); + + code_ += " match self.{{FIELD_TYPE_FIELD_NAME}}_type() {"; + code_ += " {{ENUM_NAME}}::NONE => (),"; + ForAllUnionObjectVariantsBesidesNone(enum_def, [&] { + code_.SetValue("FIELD_TYPE_FIELD_NAME", field.name); + code_ += " {{ENUM_NAME}}::{{VARIANT_NAME}} => {"; + code_ += + " let f = " + "self.{{FIELD_TYPE_FIELD_NAME}}_as_{{U_ELEMENT_NAME}}()"; + code_ += + " .expect(\"Invalid union table, expected " + "`{{ENUM_NAME}}::{{VARIANT_NAME}}`.\");"; + code_ += " s.serialize_field(\"{{FIELD_NAME}}\", &f)?;"; + code_ += " }"; + }); + code_ += " _ => unimplemented!(),"; + code_ += " }"; + } else { + code_ += + " s.serialize_field(\"{{FIELD_NAME}}\", " + "&self.{{FIELD_NAME}}())?;"; + } + } else { + if (field.IsOptional()) { + code_ += " if let Some(f) = self.{{FIELD_NAME}}() {"; + code_ += " s.serialize_field(\"{{FIELD_NAME}}\", &f)?;"; + code_ += " } else {"; + code_ += " s.skip_field(\"{{FIELD_NAME}}\")?;"; + code_ += " }"; + } else { + code_ += + " s.serialize_field(\"{{FIELD_NAME}}\", " + "&self.{{FIELD_NAME}}())?;"; + } + } + }); + code_ += " s.end()"; + code_ += " }"; + code_ += "}"; + code_ += ""; + } // Generate a builder struct: code_ += "pub struct {{STRUCT_NAME}}Builder<'a: 'b, 'b> {"; @@ -2636,6 +2729,36 @@ class RustGenerator : public BaseGenerator { code_ += " v.in_buffer::<Self>(pos)"; code_ += " }"; code_ += "}"; + code_ += ""; + + // Implement serde::Serialize + if (parser_.opts.rust_serialize) { + const auto numFields = struct_def.fields.vec.size(); + code_.SetValue("NUM_FIELDS", NumToString(numFields)); + code_ += "impl Serialize for {{STRUCT_NAME}} {"; + code_ += + " fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>"; + code_ += " where"; + code_ += " S: Serializer,"; + code_ += " {"; + if (numFields == 0) { + code_ += + " let s = serializer.serialize_struct(\"{{STRUCT_NAME}}\", 0)?;"; + } else { + code_ += + " let mut s = serializer.serialize_struct(\"{{STRUCT_NAME}}\", " + "{{NUM_FIELDS}})?;"; + } + ForAllStructFields(struct_def, [&](const FieldDef &unused) { + (void)unused; + code_ += + " s.serialize_field(\"{{FIELD_NAME}}\", &self.{{FIELD_NAME}}())?;"; + }); + code_ += " s.end()"; + code_ += " }"; + code_ += "}"; + code_ += ""; + } // Generate a constructor that takes all fields as arguments. code_ += "impl<'a> {{STRUCT_NAME}} {"; @@ -2834,6 +2957,12 @@ class RustGenerator : public BaseGenerator { code_ += indent + "use std::mem;"; code_ += indent + "use std::cmp::Ordering;"; code_ += ""; + if (parser_.opts.rust_serialize) { + code_ += indent + "extern crate serde;"; + code_ += indent + + "use self::serde::ser::{Serialize, Serializer, SerializeStruct};"; + code_ += ""; + } code_ += indent + "extern crate flatbuffers;"; code_ += indent + "use self::flatbuffers::{EndianScalar, Follow};"; } diff --git a/tests/RustTest.sh b/tests/RustTest.sh index d2dd229f..c0e1f9ef 100755 --- a/tests/RustTest.sh +++ b/tests/RustTest.sh @@ -31,7 +31,11 @@ function check_test_result() { fi } -cd ./rust_usage_test +cd ./rust_serialize_test +cargo run $TARGET_FLAG -- --quiet +check_test_result "Rust serde tests" + +cd ../rust_usage_test cargo test $TARGET_FLAG -- --quiet check_test_result "Rust tests" diff --git a/tests/arrays_test/my_game/example/array_struct_generated.rs b/tests/arrays_test/my_game/example/array_struct_generated.rs index ded58e6e..dea3655a 100644 --- a/tests/arrays_test/my_game/example/array_struct_generated.rs +++ b/tests/arrays_test/my_game/example/array_struct_generated.rs @@ -73,6 +73,7 @@ impl<'a> flatbuffers::Verifiable for ArrayStruct { v.in_buffer::<Self>(pos) } } + impl<'a> ArrayStruct { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/arrays_test/my_game/example/array_table_generated.rs b/tests/arrays_test/my_game/example/array_table_generated.rs index 9a2fe7d0..f46ac747 100644 --- a/tests/arrays_test/my_game/example/array_table_generated.rs +++ b/tests/arrays_test/my_game/example/array_table_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for ArrayTableArgs<'a> { } } } + pub struct ArrayTableBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/arrays_test/my_game/example/nested_struct_generated.rs b/tests/arrays_test/my_game/example/nested_struct_generated.rs index 511c64aa..48a6b91f 100644 --- a/tests/arrays_test/my_game/example/nested_struct_generated.rs +++ b/tests/arrays_test/my_game/example/nested_struct_generated.rs @@ -71,6 +71,7 @@ impl<'a> flatbuffers::Verifiable for NestedStruct { v.in_buffer::<Self>(pos) } } + impl<'a> NestedStruct { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/include_test1/my_game/other_name_space/table_b_generated.rs b/tests/include_test1/my_game/other_name_space/table_b_generated.rs index d7aee640..46a99cb0 100644 --- a/tests/include_test1/my_game/other_name_space/table_b_generated.rs +++ b/tests/include_test1/my_game/other_name_space/table_b_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for TableBArgs<'a> { } } } + pub struct TableBBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/include_test1/my_game/other_name_space/unused_generated.rs b/tests/include_test1/my_game/other_name_space/unused_generated.rs index f3fb099f..1dc5913e 100644 --- a/tests/include_test1/my_game/other_name_space/unused_generated.rs +++ b/tests/include_test1/my_game/other_name_space/unused_generated.rs @@ -68,6 +68,7 @@ impl<'a> flatbuffers::Verifiable for Unused { v.in_buffer::<Self>(pos) } } + impl<'a> Unused { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/include_test1/table_a_generated.rs b/tests/include_test1/table_a_generated.rs index 89c6a5fc..9188b293 100644 --- a/tests/include_test1/table_a_generated.rs +++ b/tests/include_test1/table_a_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for TableAArgs<'a> { } } } + pub struct TableABuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/include_test2/my_game/other_name_space/table_b_generated.rs b/tests/include_test2/my_game/other_name_space/table_b_generated.rs index d7aee640..46a99cb0 100644 --- a/tests/include_test2/my_game/other_name_space/table_b_generated.rs +++ b/tests/include_test2/my_game/other_name_space/table_b_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for TableBArgs<'a> { } } } + pub struct TableBBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/include_test2/my_game/other_name_space/unused_generated.rs b/tests/include_test2/my_game/other_name_space/unused_generated.rs index f3fb099f..1dc5913e 100644 --- a/tests/include_test2/my_game/other_name_space/unused_generated.rs +++ b/tests/include_test2/my_game/other_name_space/unused_generated.rs @@ -68,6 +68,7 @@ impl<'a> flatbuffers::Verifiable for Unused { v.in_buffer::<Self>(pos) } } + impl<'a> Unused { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/include_test2/table_a_generated.rs b/tests/include_test2/table_a_generated.rs index 89c6a5fc..9188b293 100644 --- a/tests/include_test2/table_a_generated.rs +++ b/tests/include_test2/table_a_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for TableAArgs<'a> { } } } + pub struct TableABuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/keyword_test/keyword_test/keywords_in_table_generated.rs b/tests/keyword_test/keyword_test/keywords_in_table_generated.rs index 17bcd0c0..6a16f056 100644 --- a/tests/keyword_test/keyword_test/keywords_in_table_generated.rs +++ b/tests/keyword_test/keyword_test/keywords_in_table_generated.rs @@ -98,6 +98,7 @@ impl<'a> Default for KeywordsInTableArgs { } } } + pub struct KeywordsInTableBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/example/ability_generated.rs b/tests/monster_test/my_game/example/ability_generated.rs index 444e41b8..5746e8e9 100644 --- a/tests/monster_test/my_game/example/ability_generated.rs +++ b/tests/monster_test/my_game/example/ability_generated.rs @@ -69,6 +69,7 @@ impl<'a> flatbuffers::Verifiable for Ability { v.in_buffer::<Self>(pos) } } + impl<'a> Ability { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/monster_test/my_game/example/monster_generated.rs b/tests/monster_test/my_game/example/monster_generated.rs index d30525fd..d9c36a2b 100644 --- a/tests/monster_test/my_game/example/monster_generated.rs +++ b/tests/monster_test/my_game/example/monster_generated.rs @@ -847,6 +847,7 @@ impl<'a> Default for MonsterArgs<'a> { } } } + pub struct MonsterBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/example/referrable_generated.rs b/tests/monster_test/my_game/example/referrable_generated.rs index b706f1d8..877e3b83 100644 --- a/tests/monster_test/my_game/example/referrable_generated.rs +++ b/tests/monster_test/my_game/example/referrable_generated.rs @@ -86,6 +86,7 @@ impl<'a> Default for ReferrableArgs { } } } + pub struct ReferrableBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/example/stat_generated.rs b/tests/monster_test/my_game/example/stat_generated.rs index 338c4439..d6e5fad5 100644 --- a/tests/monster_test/my_game/example/stat_generated.rs +++ b/tests/monster_test/my_game/example/stat_generated.rs @@ -110,6 +110,7 @@ impl<'a> Default for StatArgs<'a> { } } } + pub struct StatBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/example/struct_of_structs_generated.rs b/tests/monster_test/my_game/example/struct_of_structs_generated.rs index 47a12505..9994f7e3 100644 --- a/tests/monster_test/my_game/example/struct_of_structs_generated.rs +++ b/tests/monster_test/my_game/example/struct_of_structs_generated.rs @@ -70,6 +70,7 @@ impl<'a> flatbuffers::Verifiable for StructOfStructs { v.in_buffer::<Self>(pos) } } + impl<'a> StructOfStructs { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/monster_test/my_game/example/test_generated.rs b/tests/monster_test/my_game/example/test_generated.rs index 5308a520..187b7cd6 100644 --- a/tests/monster_test/my_game/example/test_generated.rs +++ b/tests/monster_test/my_game/example/test_generated.rs @@ -69,6 +69,7 @@ impl<'a> flatbuffers::Verifiable for Test { v.in_buffer::<Self>(pos) } } + impl<'a> Test { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/monster_test/my_game/example/test_simple_table_with_enum_generated.rs b/tests/monster_test/my_game/example/test_simple_table_with_enum_generated.rs index 74014e74..6ebe31fc 100644 --- a/tests/monster_test/my_game/example/test_simple_table_with_enum_generated.rs +++ b/tests/monster_test/my_game/example/test_simple_table_with_enum_generated.rs @@ -76,6 +76,7 @@ impl<'a> Default for TestSimpleTableWithEnumArgs { } } } + pub struct TestSimpleTableWithEnumBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/example/type_aliases_generated.rs b/tests/monster_test/my_game/example/type_aliases_generated.rs index aee59bdd..5b3ede58 100644 --- a/tests/monster_test/my_game/example/type_aliases_generated.rs +++ b/tests/monster_test/my_game/example/type_aliases_generated.rs @@ -201,6 +201,7 @@ impl<'a> Default for TypeAliasesArgs<'a> { } } } + pub struct TypeAliasesBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/example/vec_3_generated.rs b/tests/monster_test/my_game/example/vec_3_generated.rs index d4efb24e..e5a25bbf 100644 --- a/tests/monster_test/my_game/example/vec_3_generated.rs +++ b/tests/monster_test/my_game/example/vec_3_generated.rs @@ -73,6 +73,7 @@ impl<'a> flatbuffers::Verifiable for Vec3 { v.in_buffer::<Self>(pos) } } + impl<'a> Vec3 { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/monster_test/my_game/example_2/monster_generated.rs b/tests/monster_test/my_game/example_2/monster_generated.rs index b1defc42..54384b50 100644 --- a/tests/monster_test/my_game/example_2/monster_generated.rs +++ b/tests/monster_test/my_game/example_2/monster_generated.rs @@ -64,6 +64,7 @@ impl<'a> Default for MonsterArgs { } } } + pub struct MonsterBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/in_parent_namespace_generated.rs b/tests/monster_test/my_game/in_parent_namespace_generated.rs index 84d25bf6..aabd4b83 100644 --- a/tests/monster_test/my_game/in_parent_namespace_generated.rs +++ b/tests/monster_test/my_game/in_parent_namespace_generated.rs @@ -64,6 +64,7 @@ impl<'a> Default for InParentNamespaceArgs { } } } + pub struct InParentNamespaceBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/other_name_space/table_b_generated.rs b/tests/monster_test/my_game/other_name_space/table_b_generated.rs index d7aee640..46a99cb0 100644 --- a/tests/monster_test/my_game/other_name_space/table_b_generated.rs +++ b/tests/monster_test/my_game/other_name_space/table_b_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for TableBArgs<'a> { } } } + pub struct TableBBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test/my_game/other_name_space/unused_generated.rs b/tests/monster_test/my_game/other_name_space/unused_generated.rs index f3fb099f..1dc5913e 100644 --- a/tests/monster_test/my_game/other_name_space/unused_generated.rs +++ b/tests/monster_test/my_game/other_name_space/unused_generated.rs @@ -68,6 +68,7 @@ impl<'a> flatbuffers::Verifiable for Unused { v.in_buffer::<Self>(pos) } } + impl<'a> Unused { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/monster_test/table_a_generated.rs b/tests/monster_test/table_a_generated.rs index 89c6a5fc..9188b293 100644 --- a/tests/monster_test/table_a_generated.rs +++ b/tests/monster_test/table_a_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for TableAArgs<'a> { } } } + pub struct TableABuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/monster_test_serialize/mod.rs b/tests/monster_test_serialize/mod.rs new file mode 100644 index 00000000..3a4f8212 --- /dev/null +++ b/tests/monster_test_serialize/mod.rs @@ -0,0 +1,53 @@ +// Automatically generated by the Flatbuffers compiler. Do not modify. +pub mod my_game { + use super::*; + pub mod example { + use super::*; + mod color_generated; + pub use self::color_generated::*; + mod race_generated; + pub use self::race_generated::*; + mod any_generated; + pub use self::any_generated::*; + mod any_unique_aliases_generated; + pub use self::any_unique_aliases_generated::*; + mod any_ambiguous_aliases_generated; + pub use self::any_ambiguous_aliases_generated::*; + mod test_generated; + pub use self::test_generated::*; + mod test_simple_table_with_enum_generated; + pub use self::test_simple_table_with_enum_generated::*; + mod vec_3_generated; + pub use self::vec_3_generated::*; + mod ability_generated; + pub use self::ability_generated::*; + mod struct_of_structs_generated; + pub use self::struct_of_structs_generated::*; + mod stat_generated; + pub use self::stat_generated::*; + mod referrable_generated; + pub use self::referrable_generated::*; + mod monster_generated; + pub use self::monster_generated::*; + mod type_aliases_generated; + pub use self::type_aliases_generated::*; + } // example + pub mod example_2 { + use super::*; + mod monster_generated; + pub use self::monster_generated::*; + } // example_2 + pub mod other_name_space { + use super::*; + mod from_include_generated; + pub use self::from_include_generated::*; + mod unused_generated; + pub use self::unused_generated::*; + mod table_b_generated; + pub use self::table_b_generated::*; + } // other_name_space + mod in_parent_namespace_generated; + pub use self::in_parent_namespace_generated::*; +} // my_game +mod table_a_generated; +pub use self::table_a_generated::*; diff --git a/tests/monster_test_serialize/my_game/example/ability_generated.rs b/tests/monster_test_serialize/my_game/example/ability_generated.rs new file mode 100644 index 00000000..cdc78825 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/ability_generated.rs @@ -0,0 +1,180 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +// struct Ability, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct Ability(pub [u8; 8]); +impl Default for Ability { + fn default() -> Self { + Self([0; 8]) + } +} +impl std::fmt::Debug for Ability { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct("Ability") + .field("id", &self.id()) + .field("distance", &self.distance()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Ability {} +impl flatbuffers::SafeSliceAccess for Ability {} +impl<'a> flatbuffers::Follow<'a> for Ability { + type Inner = &'a Ability; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a Ability>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a Ability { + type Inner = &'a Ability; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::<Ability>(buf, loc) + } +} +impl<'b> flatbuffers::Push for Ability { + type Output = Ability; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(self as *const Ability as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} +impl<'b> flatbuffers::Push for &'b Ability { + type Output = Ability; + + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(*self as *const Ability as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} + +impl<'a> flatbuffers::Verifiable for Ability { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::<Self>(pos) + } +} + +impl Serialize for Ability { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("Ability", 2)?; + s.serialize_field("id", &self.id())?; + s.serialize_field("distance", &self.distance())?; + s.end() + } +} + +impl<'a> Ability { + #[allow(clippy::too_many_arguments)] + pub fn new( + id: u32, + distance: u32, + ) -> Self { + let mut s = Self([0; 8]); + s.set_id(id); + s.set_distance(distance); + s + } + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.Ability" + } + + pub fn id(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<u32>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<u32>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_id(&mut self, x: u32) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const u32 as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<u32>(), + ); + } + } + + #[inline] + pub fn key_compare_less_than(&self, o: &Ability) -> bool { + self.id() < o.id() + } + + #[inline] + pub fn key_compare_with_value(&self, val: u32) -> ::std::cmp::Ordering { + let key = self.id(); + key.cmp(&val) + } + pub fn distance(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<u32>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<u32>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_distance(&mut self, x: u32) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const u32 as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<u32>(), + ); + } + } + + pub fn unpack(&self) -> AbilityT { + AbilityT { + id: self.id(), + distance: self.distance(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Default)] +pub struct AbilityT { + pub id: u32, + pub distance: u32, +} +impl AbilityT { + pub fn pack(&self) -> Ability { + Ability::new( + self.id, + self.distance, + ) + } +} + diff --git a/tests/monster_test_serialize/my_game/example/any_ambiguous_aliases_generated.rs b/tests/monster_test_serialize/my_game/example/any_ambiguous_aliases_generated.rs new file mode 100644 index 00000000..2e757a80 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/any_ambiguous_aliases_generated.rs @@ -0,0 +1,209 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +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_ANY_AMBIGUOUS_ALIASES: u8 = 0; +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +pub const ENUM_MAX_ANY_AMBIGUOUS_ALIASES: u8 = 3; +#[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_ANY_AMBIGUOUS_ALIASES: [AnyAmbiguousAliases; 4] = [ + AnyAmbiguousAliases::NONE, + AnyAmbiguousAliases::M1, + AnyAmbiguousAliases::M2, + AnyAmbiguousAliases::M3, +]; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +#[repr(transparent)] +pub struct AnyAmbiguousAliases(pub u8); +#[allow(non_upper_case_globals)] +impl AnyAmbiguousAliases { + pub const NONE: Self = Self(0); + pub const M1: Self = Self(1); + pub const M2: Self = Self(2); + pub const M3: Self = Self(3); + + pub const ENUM_MIN: u8 = 0; + pub const ENUM_MAX: u8 = 3; + pub const ENUM_VALUES: &'static [Self] = &[ + Self::NONE, + Self::M1, + Self::M2, + Self::M3, + ]; + /// Returns the variant's name or "" if unknown. + pub fn variant_name(self) -> Option<&'static str> { + match self { + Self::NONE => Some("NONE"), + Self::M1 => Some("M1"), + Self::M2 => Some("M2"), + Self::M3 => Some("M3"), + _ => None, + } + } +} +impl std::fmt::Debug for AnyAmbiguousAliases { + 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 Serialize for AnyAmbiguousAliases { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_unit_variant("AnyAmbiguousAliases", self.0 as u32, self.variant_name().unwrap()) + } +} + +impl<'a> flatbuffers::Follow<'a> for AnyAmbiguousAliases { + type Inner = Self; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + let b = unsafe { + flatbuffers::read_scalar_at::<u8>(buf, loc) + }; + Self(b) + } +} + +impl flatbuffers::Push for AnyAmbiguousAliases { + type Output = AnyAmbiguousAliases; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + unsafe { flatbuffers::emplace_scalar::<u8>(dst, self.0); } + } +} + +impl flatbuffers::EndianScalar for AnyAmbiguousAliases { + #[inline] + fn to_little_endian(self) -> Self { + let b = u8::to_le(self.0); + Self(b) + } + #[inline] + #[allow(clippy::wrong_self_convention)] + fn from_little_endian(self) -> Self { + let b = u8::from_le(self.0); + Self(b) + } +} + +impl<'a> flatbuffers::Verifiable for AnyAmbiguousAliases { + #[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 AnyAmbiguousAliases {} +pub struct AnyAmbiguousAliasesUnionTableOffset {} + +#[allow(clippy::upper_case_acronyms)] +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub enum AnyAmbiguousAliasesT { + NONE, + M1(Box<MonsterT>), + M2(Box<MonsterT>), + M3(Box<MonsterT>), +} +impl Default for AnyAmbiguousAliasesT { + fn default() -> Self { + Self::NONE + } +} +impl AnyAmbiguousAliasesT { + pub fn any_ambiguous_aliases_type(&self) -> AnyAmbiguousAliases { + match self { + Self::NONE => AnyAmbiguousAliases::NONE, + Self::M1(_) => AnyAmbiguousAliases::M1, + Self::M2(_) => AnyAmbiguousAliases::M2, + Self::M3(_) => AnyAmbiguousAliases::M3, + } + } + pub fn pack(&self, fbb: &mut flatbuffers::FlatBufferBuilder) -> Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>> { + match self { + Self::NONE => None, + Self::M1(v) => Some(v.pack(fbb).as_union_value()), + Self::M2(v) => Some(v.pack(fbb).as_union_value()), + Self::M3(v) => Some(v.pack(fbb).as_union_value()), + } + } + /// If the union variant matches, return the owned MonsterT, setting the union to NONE. + pub fn take_m1(&mut self) -> Option<Box<MonsterT>> { + if let Self::M1(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::M1(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the MonsterT. + pub fn as_m1(&self) -> Option<&MonsterT> { + if let Self::M1(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the MonsterT. + pub fn as_m1_mut(&mut self) -> Option<&mut MonsterT> { + if let Self::M1(v) = self { Some(v.as_mut()) } else { None } + } + /// If the union variant matches, return the owned MonsterT, setting the union to NONE. + pub fn take_m2(&mut self) -> Option<Box<MonsterT>> { + if let Self::M2(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::M2(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the MonsterT. + pub fn as_m2(&self) -> Option<&MonsterT> { + if let Self::M2(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the MonsterT. + pub fn as_m2_mut(&mut self) -> Option<&mut MonsterT> { + if let Self::M2(v) = self { Some(v.as_mut()) } else { None } + } + /// If the union variant matches, return the owned MonsterT, setting the union to NONE. + pub fn take_m3(&mut self) -> Option<Box<MonsterT>> { + if let Self::M3(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::M3(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the MonsterT. + pub fn as_m3(&self) -> Option<&MonsterT> { + if let Self::M3(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the MonsterT. + pub fn as_m3_mut(&mut self) -> Option<&mut MonsterT> { + if let Self::M3(v) = self { Some(v.as_mut()) } else { None } + } +} diff --git a/tests/monster_test_serialize/my_game/example/any_generated.rs b/tests/monster_test_serialize/my_game/example/any_generated.rs new file mode 100644 index 00000000..d5726428 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/any_generated.rs @@ -0,0 +1,209 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +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_ANY: u8 = 0; +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +pub const ENUM_MAX_ANY: u8 = 3; +#[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_ANY: [Any; 4] = [ + Any::NONE, + Any::Monster, + Any::TestSimpleTableWithEnum, + Any::MyGame_Example2_Monster, +]; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +#[repr(transparent)] +pub struct Any(pub u8); +#[allow(non_upper_case_globals)] +impl Any { + pub const NONE: Self = Self(0); + pub const Monster: Self = Self(1); + pub const TestSimpleTableWithEnum: Self = Self(2); + pub const MyGame_Example2_Monster: Self = Self(3); + + pub const ENUM_MIN: u8 = 0; + pub const ENUM_MAX: u8 = 3; + pub const ENUM_VALUES: &'static [Self] = &[ + Self::NONE, + Self::Monster, + Self::TestSimpleTableWithEnum, + Self::MyGame_Example2_Monster, + ]; + /// Returns the variant's name or "" if unknown. + pub fn variant_name(self) -> Option<&'static str> { + match self { + Self::NONE => Some("NONE"), + Self::Monster => Some("Monster"), + Self::TestSimpleTableWithEnum => Some("TestSimpleTableWithEnum"), + Self::MyGame_Example2_Monster => Some("MyGame_Example2_Monster"), + _ => None, + } + } +} +impl std::fmt::Debug for Any { + 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 Serialize for Any { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_unit_variant("Any", self.0 as u32, self.variant_name().unwrap()) + } +} + +impl<'a> flatbuffers::Follow<'a> for Any { + type Inner = Self; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + let b = unsafe { + flatbuffers::read_scalar_at::<u8>(buf, loc) + }; + Self(b) + } +} + +impl flatbuffers::Push for Any { + type Output = Any; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + unsafe { flatbuffers::emplace_scalar::<u8>(dst, self.0); } + } +} + +impl flatbuffers::EndianScalar for Any { + #[inline] + fn to_little_endian(self) -> Self { + let b = u8::to_le(self.0); + Self(b) + } + #[inline] + #[allow(clippy::wrong_self_convention)] + fn from_little_endian(self) -> Self { + let b = u8::from_le(self.0); + Self(b) + } +} + +impl<'a> flatbuffers::Verifiable for Any { + #[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 Any {} +pub struct AnyUnionTableOffset {} + +#[allow(clippy::upper_case_acronyms)] +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub enum AnyT { + NONE, + Monster(Box<MonsterT>), + TestSimpleTableWithEnum(Box<TestSimpleTableWithEnumT>), + MyGameExample2Monster(Box<super::example_2::MonsterT>), +} +impl Default for AnyT { + fn default() -> Self { + Self::NONE + } +} +impl AnyT { + pub fn any_type(&self) -> Any { + match self { + Self::NONE => Any::NONE, + Self::Monster(_) => Any::Monster, + Self::TestSimpleTableWithEnum(_) => Any::TestSimpleTableWithEnum, + Self::MyGameExample2Monster(_) => Any::MyGame_Example2_Monster, + } + } + pub fn pack(&self, fbb: &mut flatbuffers::FlatBufferBuilder) -> Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>> { + match self { + Self::NONE => None, + Self::Monster(v) => Some(v.pack(fbb).as_union_value()), + Self::TestSimpleTableWithEnum(v) => Some(v.pack(fbb).as_union_value()), + Self::MyGameExample2Monster(v) => Some(v.pack(fbb).as_union_value()), + } + } + /// If the union variant matches, return the owned MonsterT, setting the union to NONE. + pub fn take_monster(&mut self) -> Option<Box<MonsterT>> { + if let Self::Monster(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::Monster(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the MonsterT. + pub fn as_monster(&self) -> Option<&MonsterT> { + if let Self::Monster(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the MonsterT. + pub fn as_monster_mut(&mut self) -> Option<&mut MonsterT> { + if let Self::Monster(v) = self { Some(v.as_mut()) } else { None } + } + /// If the union variant matches, return the owned TestSimpleTableWithEnumT, setting the union to NONE. + pub fn take_test_simple_table_with_enum(&mut self) -> Option<Box<TestSimpleTableWithEnumT>> { + if let Self::TestSimpleTableWithEnum(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::TestSimpleTableWithEnum(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the TestSimpleTableWithEnumT. + pub fn as_test_simple_table_with_enum(&self) -> Option<&TestSimpleTableWithEnumT> { + if let Self::TestSimpleTableWithEnum(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the TestSimpleTableWithEnumT. + pub fn as_test_simple_table_with_enum_mut(&mut self) -> Option<&mut TestSimpleTableWithEnumT> { + if let Self::TestSimpleTableWithEnum(v) = self { Some(v.as_mut()) } else { None } + } + /// If the union variant matches, return the owned super::example_2::MonsterT, setting the union to NONE. + pub fn take_my_game_example_2_monster(&mut self) -> Option<Box<super::example_2::MonsterT>> { + if let Self::MyGameExample2Monster(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::MyGameExample2Monster(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the super::example_2::MonsterT. + pub fn as_my_game_example_2_monster(&self) -> Option<&super::example_2::MonsterT> { + if let Self::MyGameExample2Monster(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the super::example_2::MonsterT. + pub fn as_my_game_example_2_monster_mut(&mut self) -> Option<&mut super::example_2::MonsterT> { + if let Self::MyGameExample2Monster(v) = self { Some(v.as_mut()) } else { None } + } +} diff --git a/tests/monster_test_serialize/my_game/example/any_unique_aliases_generated.rs b/tests/monster_test_serialize/my_game/example/any_unique_aliases_generated.rs new file mode 100644 index 00000000..8a3fa66d --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/any_unique_aliases_generated.rs @@ -0,0 +1,209 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +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_ANY_UNIQUE_ALIASES: u8 = 0; +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +pub const ENUM_MAX_ANY_UNIQUE_ALIASES: u8 = 3; +#[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_ANY_UNIQUE_ALIASES: [AnyUniqueAliases; 4] = [ + AnyUniqueAliases::NONE, + AnyUniqueAliases::M, + AnyUniqueAliases::TS, + AnyUniqueAliases::M2, +]; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +#[repr(transparent)] +pub struct AnyUniqueAliases(pub u8); +#[allow(non_upper_case_globals)] +impl AnyUniqueAliases { + pub const NONE: Self = Self(0); + pub const M: Self = Self(1); + pub const TS: Self = Self(2); + pub const M2: Self = Self(3); + + pub const ENUM_MIN: u8 = 0; + pub const ENUM_MAX: u8 = 3; + pub const ENUM_VALUES: &'static [Self] = &[ + Self::NONE, + Self::M, + Self::TS, + Self::M2, + ]; + /// Returns the variant's name or "" if unknown. + pub fn variant_name(self) -> Option<&'static str> { + match self { + Self::NONE => Some("NONE"), + Self::M => Some("M"), + Self::TS => Some("TS"), + Self::M2 => Some("M2"), + _ => None, + } + } +} +impl std::fmt::Debug for AnyUniqueAliases { + 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 Serialize for AnyUniqueAliases { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_unit_variant("AnyUniqueAliases", self.0 as u32, self.variant_name().unwrap()) + } +} + +impl<'a> flatbuffers::Follow<'a> for AnyUniqueAliases { + type Inner = Self; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + let b = unsafe { + flatbuffers::read_scalar_at::<u8>(buf, loc) + }; + Self(b) + } +} + +impl flatbuffers::Push for AnyUniqueAliases { + type Output = AnyUniqueAliases; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + unsafe { flatbuffers::emplace_scalar::<u8>(dst, self.0); } + } +} + +impl flatbuffers::EndianScalar for AnyUniqueAliases { + #[inline] + fn to_little_endian(self) -> Self { + let b = u8::to_le(self.0); + Self(b) + } + #[inline] + #[allow(clippy::wrong_self_convention)] + fn from_little_endian(self) -> Self { + let b = u8::from_le(self.0); + Self(b) + } +} + +impl<'a> flatbuffers::Verifiable for AnyUniqueAliases { + #[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 AnyUniqueAliases {} +pub struct AnyUniqueAliasesUnionTableOffset {} + +#[allow(clippy::upper_case_acronyms)] +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub enum AnyUniqueAliasesT { + NONE, + M(Box<MonsterT>), + TS(Box<TestSimpleTableWithEnumT>), + M2(Box<super::example_2::MonsterT>), +} +impl Default for AnyUniqueAliasesT { + fn default() -> Self { + Self::NONE + } +} +impl AnyUniqueAliasesT { + pub fn any_unique_aliases_type(&self) -> AnyUniqueAliases { + match self { + Self::NONE => AnyUniqueAliases::NONE, + Self::M(_) => AnyUniqueAliases::M, + Self::TS(_) => AnyUniqueAliases::TS, + Self::M2(_) => AnyUniqueAliases::M2, + } + } + pub fn pack(&self, fbb: &mut flatbuffers::FlatBufferBuilder) -> Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>> { + match self { + Self::NONE => None, + Self::M(v) => Some(v.pack(fbb).as_union_value()), + Self::TS(v) => Some(v.pack(fbb).as_union_value()), + Self::M2(v) => Some(v.pack(fbb).as_union_value()), + } + } + /// If the union variant matches, return the owned MonsterT, setting the union to NONE. + pub fn take_m(&mut self) -> Option<Box<MonsterT>> { + if let Self::M(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::M(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the MonsterT. + pub fn as_m(&self) -> Option<&MonsterT> { + if let Self::M(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the MonsterT. + pub fn as_m_mut(&mut self) -> Option<&mut MonsterT> { + if let Self::M(v) = self { Some(v.as_mut()) } else { None } + } + /// If the union variant matches, return the owned TestSimpleTableWithEnumT, setting the union to NONE. + pub fn take_ts(&mut self) -> Option<Box<TestSimpleTableWithEnumT>> { + if let Self::TS(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::TS(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the TestSimpleTableWithEnumT. + pub fn as_ts(&self) -> Option<&TestSimpleTableWithEnumT> { + if let Self::TS(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the TestSimpleTableWithEnumT. + pub fn as_ts_mut(&mut self) -> Option<&mut TestSimpleTableWithEnumT> { + if let Self::TS(v) = self { Some(v.as_mut()) } else { None } + } + /// If the union variant matches, return the owned super::example_2::MonsterT, setting the union to NONE. + pub fn take_m2(&mut self) -> Option<Box<super::example_2::MonsterT>> { + if let Self::M2(_) = self { + let v = std::mem::replace(self, Self::NONE); + if let Self::M2(w) = v { + Some(w) + } else { + unreachable!() + } + } else { + None + } + } + /// If the union variant matches, return a reference to the super::example_2::MonsterT. + pub fn as_m2(&self) -> Option<&super::example_2::MonsterT> { + if let Self::M2(v) = self { Some(v.as_ref()) } else { None } + } + /// If the union variant matches, return a mutable reference to the super::example_2::MonsterT. + pub fn as_m2_mut(&mut self) -> Option<&mut super::example_2::MonsterT> { + if let Self::M2(v) = self { Some(v.as_mut()) } else { None } + } +} diff --git a/tests/monster_test_serialize/my_game/example/color_generated.rs b/tests/monster_test_serialize/my_game/example/color_generated.rs new file mode 100644 index 00000000..e27f79ca --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/color_generated.rs @@ -0,0 +1,78 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +#[allow(non_upper_case_globals)] +mod bitflags_color { + flatbuffers::bitflags::bitflags! { + /// Composite components of Monster color. + #[derive(Default)] + pub struct Color: u8 { + const Red = 1; + /// \brief color Green + /// Green is bit_flag with value (1u << 1) + const Green = 2; + /// \brief color Blue (1u << 3) + const Blue = 8; + } + } +} +pub use self::bitflags_color::Color; + +impl Serialize for Color { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_u32(self.bits() as u32) + } +} + +impl<'a> flatbuffers::Follow<'a> for Color { + type Inner = Self; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + let b = unsafe { + flatbuffers::read_scalar_at::<u8>(buf, loc) + }; + unsafe { Self::from_bits_unchecked(b) } + } +} + +impl flatbuffers::Push for Color { + type Output = Color; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + unsafe { flatbuffers::emplace_scalar::<u8>(dst, self.bits()); } + } +} + +impl flatbuffers::EndianScalar for Color { + #[inline] + fn to_little_endian(self) -> Self { + let b = u8::to_le(self.bits()); + unsafe { Self::from_bits_unchecked(b) } + } + #[inline] + #[allow(clippy::wrong_self_convention)] + fn from_little_endian(self) -> Self { + let b = u8::from_le(self.bits()); + unsafe { Self::from_bits_unchecked(b) } + } +} + +impl<'a> flatbuffers::Verifiable for Color { + #[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 Color {} diff --git a/tests/monster_test_serialize/my_game/example/monster_generated.rs b/tests/monster_test_serialize/my_game/example/monster_generated.rs new file mode 100644 index 00000000..48114ba2 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/monster_generated.rs @@ -0,0 +1,1777 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum MonsterOffset {} +#[derive(Copy, Clone, PartialEq)] + +/// an example documentation comment: "monster object" +pub struct Monster<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for Monster<'a> { + type Inner = Monster<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> Monster<'a> { + pub const VT_POS: flatbuffers::VOffsetT = 4; + pub const VT_MANA: flatbuffers::VOffsetT = 6; + pub const VT_HP: flatbuffers::VOffsetT = 8; + pub const VT_NAME: flatbuffers::VOffsetT = 10; + pub const VT_INVENTORY: flatbuffers::VOffsetT = 14; + pub const VT_COLOR: flatbuffers::VOffsetT = 16; + pub const VT_TEST_TYPE: flatbuffers::VOffsetT = 18; + pub const VT_TEST: flatbuffers::VOffsetT = 20; + pub const VT_TEST4: flatbuffers::VOffsetT = 22; + pub const VT_TESTARRAYOFSTRING: flatbuffers::VOffsetT = 24; + pub const VT_TESTARRAYOFTABLES: flatbuffers::VOffsetT = 26; + pub const VT_ENEMY: flatbuffers::VOffsetT = 28; + pub const VT_TESTNESTEDFLATBUFFER: flatbuffers::VOffsetT = 30; + pub const VT_TESTEMPTY: flatbuffers::VOffsetT = 32; + pub const VT_TESTBOOL: flatbuffers::VOffsetT = 34; + pub const VT_TESTHASHS32_FNV1: flatbuffers::VOffsetT = 36; + pub const VT_TESTHASHU32_FNV1: flatbuffers::VOffsetT = 38; + pub const VT_TESTHASHS64_FNV1: flatbuffers::VOffsetT = 40; + pub const VT_TESTHASHU64_FNV1: flatbuffers::VOffsetT = 42; + pub const VT_TESTHASHS32_FNV1A: flatbuffers::VOffsetT = 44; + pub const VT_TESTHASHU32_FNV1A: flatbuffers::VOffsetT = 46; + pub const VT_TESTHASHS64_FNV1A: flatbuffers::VOffsetT = 48; + pub const VT_TESTHASHU64_FNV1A: flatbuffers::VOffsetT = 50; + pub const VT_TESTARRAYOFBOOLS: flatbuffers::VOffsetT = 52; + pub const VT_TESTF: flatbuffers::VOffsetT = 54; + pub const VT_TESTF2: flatbuffers::VOffsetT = 56; + pub const VT_TESTF3: flatbuffers::VOffsetT = 58; + pub const VT_TESTARRAYOFSTRING2: flatbuffers::VOffsetT = 60; + pub const VT_TESTARRAYOFSORTEDSTRUCT: flatbuffers::VOffsetT = 62; + pub const VT_FLEX: flatbuffers::VOffsetT = 64; + pub const VT_TEST5: flatbuffers::VOffsetT = 66; + pub const VT_VECTOR_OF_LONGS: flatbuffers::VOffsetT = 68; + pub const VT_VECTOR_OF_DOUBLES: flatbuffers::VOffsetT = 70; + pub const VT_PARENT_NAMESPACE_TEST: flatbuffers::VOffsetT = 72; + pub const VT_VECTOR_OF_REFERRABLES: flatbuffers::VOffsetT = 74; + pub const VT_SINGLE_WEAK_REFERENCE: flatbuffers::VOffsetT = 76; + pub const VT_VECTOR_OF_WEAK_REFERENCES: flatbuffers::VOffsetT = 78; + pub const VT_VECTOR_OF_STRONG_REFERRABLES: flatbuffers::VOffsetT = 80; + pub const VT_CO_OWNING_REFERENCE: flatbuffers::VOffsetT = 82; + pub const VT_VECTOR_OF_CO_OWNING_REFERENCES: flatbuffers::VOffsetT = 84; + pub const VT_NON_OWNING_REFERENCE: flatbuffers::VOffsetT = 86; + pub const VT_VECTOR_OF_NON_OWNING_REFERENCES: flatbuffers::VOffsetT = 88; + pub const VT_ANY_UNIQUE_TYPE: flatbuffers::VOffsetT = 90; + pub const VT_ANY_UNIQUE: flatbuffers::VOffsetT = 92; + pub const VT_ANY_AMBIGUOUS_TYPE: flatbuffers::VOffsetT = 94; + pub const VT_ANY_AMBIGUOUS: flatbuffers::VOffsetT = 96; + pub const VT_VECTOR_OF_ENUMS: flatbuffers::VOffsetT = 98; + pub const VT_SIGNED_ENUM: flatbuffers::VOffsetT = 100; + pub const VT_TESTREQUIREDNESTEDFLATBUFFER: flatbuffers::VOffsetT = 102; + pub const VT_SCALAR_KEY_SORTED_TABLES: flatbuffers::VOffsetT = 104; + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.Monster" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + Monster { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + args: &'args MonsterArgs<'args> + ) -> flatbuffers::WIPOffset<Monster<'bldr>> { + let mut builder = MonsterBuilder::new(_fbb); + builder.add_non_owning_reference(args.non_owning_reference); + builder.add_co_owning_reference(args.co_owning_reference); + builder.add_single_weak_reference(args.single_weak_reference); + builder.add_testhashu64_fnv1a(args.testhashu64_fnv1a); + builder.add_testhashs64_fnv1a(args.testhashs64_fnv1a); + builder.add_testhashu64_fnv1(args.testhashu64_fnv1); + builder.add_testhashs64_fnv1(args.testhashs64_fnv1); + if let Some(x) = args.scalar_key_sorted_tables { builder.add_scalar_key_sorted_tables(x); } + if let Some(x) = args.testrequirednestedflatbuffer { builder.add_testrequirednestedflatbuffer(x); } + if let Some(x) = args.vector_of_enums { builder.add_vector_of_enums(x); } + if let Some(x) = args.any_ambiguous { builder.add_any_ambiguous(x); } + if let Some(x) = args.any_unique { builder.add_any_unique(x); } + if let Some(x) = args.vector_of_non_owning_references { builder.add_vector_of_non_owning_references(x); } + if let Some(x) = args.vector_of_co_owning_references { builder.add_vector_of_co_owning_references(x); } + if let Some(x) = args.vector_of_strong_referrables { builder.add_vector_of_strong_referrables(x); } + if let Some(x) = args.vector_of_weak_references { builder.add_vector_of_weak_references(x); } + if let Some(x) = args.vector_of_referrables { builder.add_vector_of_referrables(x); } + if let Some(x) = args.parent_namespace_test { builder.add_parent_namespace_test(x); } + if let Some(x) = args.vector_of_doubles { builder.add_vector_of_doubles(x); } + if let Some(x) = args.vector_of_longs { builder.add_vector_of_longs(x); } + if let Some(x) = args.test5 { builder.add_test5(x); } + if let Some(x) = args.flex { builder.add_flex(x); } + if let Some(x) = args.testarrayofsortedstruct { builder.add_testarrayofsortedstruct(x); } + if let Some(x) = args.testarrayofstring2 { builder.add_testarrayofstring2(x); } + builder.add_testf3(args.testf3); + builder.add_testf2(args.testf2); + builder.add_testf(args.testf); + if let Some(x) = args.testarrayofbools { builder.add_testarrayofbools(x); } + builder.add_testhashu32_fnv1a(args.testhashu32_fnv1a); + builder.add_testhashs32_fnv1a(args.testhashs32_fnv1a); + builder.add_testhashu32_fnv1(args.testhashu32_fnv1); + builder.add_testhashs32_fnv1(args.testhashs32_fnv1); + if let Some(x) = args.testempty { builder.add_testempty(x); } + if let Some(x) = args.testnestedflatbuffer { builder.add_testnestedflatbuffer(x); } + if let Some(x) = args.enemy { builder.add_enemy(x); } + if let Some(x) = args.testarrayoftables { builder.add_testarrayoftables(x); } + if let Some(x) = args.testarrayofstring { builder.add_testarrayofstring(x); } + if let Some(x) = args.test4 { builder.add_test4(x); } + if let Some(x) = args.test { builder.add_test(x); } + if let Some(x) = args.inventory { builder.add_inventory(x); } + if let Some(x) = args.name { builder.add_name(x); } + if let Some(x) = args.pos { builder.add_pos(x); } + builder.add_hp(args.hp); + builder.add_mana(args.mana); + builder.add_signed_enum(args.signed_enum); + builder.add_any_ambiguous_type(args.any_ambiguous_type); + builder.add_any_unique_type(args.any_unique_type); + builder.add_testbool(args.testbool); + builder.add_test_type(args.test_type); + builder.add_color(args.color); + builder.finish() + } + + pub fn unpack(&self) -> MonsterT { + let pos = self.pos().map(|x| { + x.unpack() + }); + let mana = self.mana(); + let hp = self.hp(); + let name = { + let x = self.name(); + x.to_string() + }; + let inventory = self.inventory().map(|x| { + x.to_vec() + }); + let color = self.color(); + let test = match self.test_type() { + Any::NONE => AnyT::NONE, + Any::Monster => AnyT::Monster(Box::new( + self.test_as_monster() + .expect("Invalid union table, expected `Any::Monster`.") + .unpack() + )), + Any::TestSimpleTableWithEnum => AnyT::TestSimpleTableWithEnum(Box::new( + self.test_as_test_simple_table_with_enum() + .expect("Invalid union table, expected `Any::TestSimpleTableWithEnum`.") + .unpack() + )), + Any::MyGame_Example2_Monster => AnyT::MyGameExample2Monster(Box::new( + self.test_as_my_game_example_2_monster() + .expect("Invalid union table, expected `Any::MyGame_Example2_Monster`.") + .unpack() + )), + _ => AnyT::NONE, + }; + let test4 = self.test4().map(|x| { + x.iter().map(|t| t.unpack()).collect() + }); + let testarrayofstring = self.testarrayofstring().map(|x| { + x.iter().map(|s| s.to_string()).collect() + }); + let testarrayoftables = self.testarrayoftables().map(|x| { + x.iter().map(|t| t.unpack()).collect() + }); + let enemy = self.enemy().map(|x| { + Box::new(x.unpack()) + }); + let testnestedflatbuffer = self.testnestedflatbuffer().map(|x| { + x.to_vec() + }); + let testempty = self.testempty().map(|x| { + Box::new(x.unpack()) + }); + let testbool = self.testbool(); + let testhashs32_fnv1 = self.testhashs32_fnv1(); + let testhashu32_fnv1 = self.testhashu32_fnv1(); + let testhashs64_fnv1 = self.testhashs64_fnv1(); + let testhashu64_fnv1 = self.testhashu64_fnv1(); + let testhashs32_fnv1a = self.testhashs32_fnv1a(); + let testhashu32_fnv1a = self.testhashu32_fnv1a(); + let testhashs64_fnv1a = self.testhashs64_fnv1a(); + let testhashu64_fnv1a = self.testhashu64_fnv1a(); + let testarrayofbools = self.testarrayofbools().map(|x| { + x.to_vec() + }); + let testf = self.testf(); + let testf2 = self.testf2(); + let testf3 = self.testf3(); + let testarrayofstring2 = self.testarrayofstring2().map(|x| { + x.iter().map(|s| s.to_string()).collect() + }); + let testarrayofsortedstruct = self.testarrayofsortedstruct().map(|x| { + x.iter().map(|t| t.unpack()).collect() + }); + let flex = self.flex().map(|x| { + x.to_vec() + }); + let test5 = self.test5().map(|x| { + x.iter().map(|t| t.unpack()).collect() + }); + let vector_of_longs = self.vector_of_longs().map(|x| { + x.into_iter().collect() + }); + let vector_of_doubles = self.vector_of_doubles().map(|x| { + x.into_iter().collect() + }); + let parent_namespace_test = self.parent_namespace_test().map(|x| { + Box::new(x.unpack()) + }); + let vector_of_referrables = self.vector_of_referrables().map(|x| { + x.iter().map(|t| t.unpack()).collect() + }); + let single_weak_reference = self.single_weak_reference(); + let vector_of_weak_references = self.vector_of_weak_references().map(|x| { + x.into_iter().collect() + }); + let vector_of_strong_referrables = self.vector_of_strong_referrables().map(|x| { + x.iter().map(|t| t.unpack()).collect() + }); + let co_owning_reference = self.co_owning_reference(); + let vector_of_co_owning_references = self.vector_of_co_owning_references().map(|x| { + x.into_iter().collect() + }); + let non_owning_reference = self.non_owning_reference(); + let vector_of_non_owning_references = self.vector_of_non_owning_references().map(|x| { + x.into_iter().collect() + }); + let any_unique = match self.any_unique_type() { + AnyUniqueAliases::NONE => AnyUniqueAliasesT::NONE, + AnyUniqueAliases::M => AnyUniqueAliasesT::M(Box::new( + self.any_unique_as_m() + .expect("Invalid union table, expected `AnyUniqueAliases::M`.") + .unpack() + )), + AnyUniqueAliases::TS => AnyUniqueAliasesT::TS(Box::new( + self.any_unique_as_ts() + .expect("Invalid union table, expected `AnyUniqueAliases::TS`.") + .unpack() + )), + AnyUniqueAliases::M2 => AnyUniqueAliasesT::M2(Box::new( + self.any_unique_as_m2() + .expect("Invalid union table, expected `AnyUniqueAliases::M2`.") + .unpack() + )), + _ => AnyUniqueAliasesT::NONE, + }; + let any_ambiguous = match self.any_ambiguous_type() { + AnyAmbiguousAliases::NONE => AnyAmbiguousAliasesT::NONE, + AnyAmbiguousAliases::M1 => AnyAmbiguousAliasesT::M1(Box::new( + self.any_ambiguous_as_m1() + .expect("Invalid union table, expected `AnyAmbiguousAliases::M1`.") + .unpack() + )), + AnyAmbiguousAliases::M2 => AnyAmbiguousAliasesT::M2(Box::new( + self.any_ambiguous_as_m2() + .expect("Invalid union table, expected `AnyAmbiguousAliases::M2`.") + .unpack() + )), + AnyAmbiguousAliases::M3 => AnyAmbiguousAliasesT::M3(Box::new( + self.any_ambiguous_as_m3() + .expect("Invalid union table, expected `AnyAmbiguousAliases::M3`.") + .unpack() + )), + _ => AnyAmbiguousAliasesT::NONE, + }; + let vector_of_enums = self.vector_of_enums().map(|x| { + x.into_iter().collect() + }); + let signed_enum = self.signed_enum(); + let testrequirednestedflatbuffer = self.testrequirednestedflatbuffer().map(|x| { + x.to_vec() + }); + let scalar_key_sorted_tables = self.scalar_key_sorted_tables().map(|x| { + x.iter().map(|t| t.unpack()).collect() + }); + MonsterT { + pos, + mana, + hp, + name, + inventory, + color, + test, + test4, + testarrayofstring, + testarrayoftables, + enemy, + testnestedflatbuffer, + testempty, + testbool, + testhashs32_fnv1, + testhashu32_fnv1, + testhashs64_fnv1, + testhashu64_fnv1, + testhashs32_fnv1a, + testhashu32_fnv1a, + testhashs64_fnv1a, + testhashu64_fnv1a, + testarrayofbools, + testf, + testf2, + testf3, + testarrayofstring2, + testarrayofsortedstruct, + flex, + test5, + vector_of_longs, + vector_of_doubles, + parent_namespace_test, + vector_of_referrables, + single_weak_reference, + vector_of_weak_references, + vector_of_strong_referrables, + co_owning_reference, + vector_of_co_owning_references, + non_owning_reference, + vector_of_non_owning_references, + any_unique, + any_ambiguous, + vector_of_enums, + signed_enum, + testrequirednestedflatbuffer, + scalar_key_sorted_tables, + } + } + + #[inline] + pub fn pos(&self) -> Option<&'a Vec3> { + self._tab.get::<Vec3>(Monster::VT_POS, None) + } + #[inline] + pub fn mana(&self) -> i16 { + self._tab.get::<i16>(Monster::VT_MANA, Some(150)).unwrap() + } + #[inline] + pub fn hp(&self) -> i16 { + self._tab.get::<i16>(Monster::VT_HP, Some(100)).unwrap() + } + #[inline] + pub fn name(&self) -> &'a str { + self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Monster::VT_NAME, None).unwrap() + } + #[inline] + pub fn key_compare_less_than(&self, o: &Monster) -> bool { + self.name() < o.name() + } + + #[inline] + pub fn key_compare_with_value(&self, val: & str) -> ::std::cmp::Ordering { + let key = self.name(); + key.cmp(val) + } + #[inline] + pub fn inventory(&self) -> Option<&'a [u8]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u8>>>(Monster::VT_INVENTORY, None).map(|v| v.safe_slice()) + } + #[inline] + pub fn color(&self) -> Color { + self._tab.get::<Color>(Monster::VT_COLOR, Some(Color::Blue)).unwrap() + } + #[inline] + pub fn test_type(&self) -> Any { + self._tab.get::<Any>(Monster::VT_TEST_TYPE, Some(Any::NONE)).unwrap() + } + #[inline] + pub fn test(&self) -> Option<flatbuffers::Table<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Table<'a>>>(Monster::VT_TEST, None) + } + #[inline] + pub fn test4(&self) -> Option<&'a [Test]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, Test>>>(Monster::VT_TEST4, None).map(|v| v.safe_slice()) + } + #[inline] + pub fn testarrayofstring(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING, None) + } + /// an example documentation comment: this will end up in the generated code + /// multiline too + #[inline] + pub fn testarrayoftables(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Monster<'a>>>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Monster>>>>(Monster::VT_TESTARRAYOFTABLES, None) + } + #[inline] + pub fn enemy(&self) -> Option<Monster<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<Monster>>(Monster::VT_ENEMY, None) + } + #[inline] + pub fn testnestedflatbuffer(&self) -> Option<&'a [u8]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTNESTEDFLATBUFFER, None).map(|v| v.safe_slice()) + } + pub fn testnestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> { + self.testnestedflatbuffer().map(|data| { + use flatbuffers::Follow; + <flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data, 0) + }) + } + #[inline] + pub fn testempty(&self) -> Option<Stat<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<Stat>>(Monster::VT_TESTEMPTY, None) + } + #[inline] + pub fn testbool(&self) -> bool { + self._tab.get::<bool>(Monster::VT_TESTBOOL, Some(false)).unwrap() + } + #[inline] + pub fn testhashs32_fnv1(&self) -> i32 { + self._tab.get::<i32>(Monster::VT_TESTHASHS32_FNV1, Some(0)).unwrap() + } + #[inline] + pub fn testhashu32_fnv1(&self) -> u32 { + self._tab.get::<u32>(Monster::VT_TESTHASHU32_FNV1, Some(0)).unwrap() + } + #[inline] + pub fn testhashs64_fnv1(&self) -> i64 { + self._tab.get::<i64>(Monster::VT_TESTHASHS64_FNV1, Some(0)).unwrap() + } + #[inline] + pub fn testhashu64_fnv1(&self) -> u64 { + self._tab.get::<u64>(Monster::VT_TESTHASHU64_FNV1, Some(0)).unwrap() + } + #[inline] + pub fn testhashs32_fnv1a(&self) -> i32 { + self._tab.get::<i32>(Monster::VT_TESTHASHS32_FNV1A, Some(0)).unwrap() + } + #[inline] + pub fn testhashu32_fnv1a(&self) -> u32 { + self._tab.get::<u32>(Monster::VT_TESTHASHU32_FNV1A, Some(0)).unwrap() + } + #[inline] + pub fn testhashs64_fnv1a(&self) -> i64 { + self._tab.get::<i64>(Monster::VT_TESTHASHS64_FNV1A, Some(0)).unwrap() + } + #[inline] + pub fn testhashu64_fnv1a(&self) -> u64 { + self._tab.get::<u64>(Monster::VT_TESTHASHU64_FNV1A, Some(0)).unwrap() + } + #[inline] + pub fn testarrayofbools(&self) -> Option<&'a [bool]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, bool>>>(Monster::VT_TESTARRAYOFBOOLS, None).map(|v| v.safe_slice()) + } + #[inline] + pub fn testf(&self) -> f32 { + self._tab.get::<f32>(Monster::VT_TESTF, Some(3.14159)).unwrap() + } + #[inline] + pub fn testf2(&self) -> f32 { + self._tab.get::<f32>(Monster::VT_TESTF2, Some(3.0)).unwrap() + } + #[inline] + pub fn testf3(&self) -> f32 { + self._tab.get::<f32>(Monster::VT_TESTF3, Some(0.0)).unwrap() + } + #[inline] + pub fn testarrayofstring2(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING2, None) + } + #[inline] + pub fn testarrayofsortedstruct(&self) -> Option<&'a [Ability]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, Ability>>>(Monster::VT_TESTARRAYOFSORTEDSTRUCT, None).map(|v| v.safe_slice()) + } + #[inline] + pub fn flex(&self) -> Option<&'a [u8]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u8>>>(Monster::VT_FLEX, None).map(|v| v.safe_slice()) + } + #[inline] + pub fn test5(&self) -> Option<&'a [Test]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, Test>>>(Monster::VT_TEST5, None).map(|v| v.safe_slice()) + } + #[inline] + pub fn vector_of_longs(&self) -> Option<flatbuffers::Vector<'a, i64>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, i64>>>(Monster::VT_VECTOR_OF_LONGS, None) + } + #[inline] + pub fn vector_of_doubles(&self) -> Option<flatbuffers::Vector<'a, f64>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, f64>>>(Monster::VT_VECTOR_OF_DOUBLES, None) + } + #[inline] + pub fn parent_namespace_test(&self) -> Option<super::InParentNamespace<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<super::InParentNamespace>>(Monster::VT_PARENT_NAMESPACE_TEST, None) + } + #[inline] + pub fn vector_of_referrables(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable<'a>>>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable>>>>(Monster::VT_VECTOR_OF_REFERRABLES, None) + } + #[inline] + pub fn single_weak_reference(&self) -> u64 { + self._tab.get::<u64>(Monster::VT_SINGLE_WEAK_REFERENCE, Some(0)).unwrap() + } + #[inline] + pub fn vector_of_weak_references(&self) -> Option<flatbuffers::Vector<'a, u64>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_WEAK_REFERENCES, None) + } + #[inline] + pub fn vector_of_strong_referrables(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable<'a>>>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable>>>>(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, None) + } + #[inline] + pub fn co_owning_reference(&self) -> u64 { + self._tab.get::<u64>(Monster::VT_CO_OWNING_REFERENCE, Some(0)).unwrap() + } + #[inline] + pub fn vector_of_co_owning_references(&self) -> Option<flatbuffers::Vector<'a, u64>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, None) + } + #[inline] + pub fn non_owning_reference(&self) -> u64 { + self._tab.get::<u64>(Monster::VT_NON_OWNING_REFERENCE, Some(0)).unwrap() + } + #[inline] + pub fn vector_of_non_owning_references(&self) -> Option<flatbuffers::Vector<'a, u64>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u64>>>(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, None) + } + #[inline] + pub fn any_unique_type(&self) -> AnyUniqueAliases { + self._tab.get::<AnyUniqueAliases>(Monster::VT_ANY_UNIQUE_TYPE, Some(AnyUniqueAliases::NONE)).unwrap() + } + #[inline] + pub fn any_unique(&self) -> Option<flatbuffers::Table<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Table<'a>>>(Monster::VT_ANY_UNIQUE, None) + } + #[inline] + pub fn any_ambiguous_type(&self) -> AnyAmbiguousAliases { + self._tab.get::<AnyAmbiguousAliases>(Monster::VT_ANY_AMBIGUOUS_TYPE, Some(AnyAmbiguousAliases::NONE)).unwrap() + } + #[inline] + pub fn any_ambiguous(&self) -> Option<flatbuffers::Table<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Table<'a>>>(Monster::VT_ANY_AMBIGUOUS, None) + } + #[inline] + pub fn vector_of_enums(&self) -> Option<flatbuffers::Vector<'a, Color>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, Color>>>(Monster::VT_VECTOR_OF_ENUMS, None) + } + #[inline] + pub fn signed_enum(&self) -> Race { + self._tab.get::<Race>(Monster::VT_SIGNED_ENUM, Some(Race::None)).unwrap() + } + #[inline] + pub fn testrequirednestedflatbuffer(&self) -> Option<&'a [u8]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, None).map(|v| v.safe_slice()) + } + pub fn testrequirednestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> { + self.testrequirednestedflatbuffer().map(|data| { + use flatbuffers::Follow; + <flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data, 0) + }) + } + #[inline] + pub fn scalar_key_sorted_tables(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Stat<'a>>>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Stat>>>>(Monster::VT_SCALAR_KEY_SORTED_TABLES, None) + } + #[inline] + #[allow(non_snake_case)] + pub fn test_as_monster(&self) -> Option<Monster<'a>> { + if self.test_type() == Any::Monster { + self.test().map(Monster::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn test_as_test_simple_table_with_enum(&self) -> Option<TestSimpleTableWithEnum<'a>> { + if self.test_type() == Any::TestSimpleTableWithEnum { + self.test().map(TestSimpleTableWithEnum::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn test_as_my_game_example_2_monster(&self) -> Option<super::example_2::Monster<'a>> { + if self.test_type() == Any::MyGame_Example2_Monster { + self.test().map(super::example_2::Monster::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn any_unique_as_m(&self) -> Option<Monster<'a>> { + if self.any_unique_type() == AnyUniqueAliases::M { + self.any_unique().map(Monster::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn any_unique_as_ts(&self) -> Option<TestSimpleTableWithEnum<'a>> { + if self.any_unique_type() == AnyUniqueAliases::TS { + self.any_unique().map(TestSimpleTableWithEnum::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn any_unique_as_m2(&self) -> Option<super::example_2::Monster<'a>> { + if self.any_unique_type() == AnyUniqueAliases::M2 { + self.any_unique().map(super::example_2::Monster::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn any_ambiguous_as_m1(&self) -> Option<Monster<'a>> { + if self.any_ambiguous_type() == AnyAmbiguousAliases::M1 { + self.any_ambiguous().map(Monster::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn any_ambiguous_as_m2(&self) -> Option<Monster<'a>> { + if self.any_ambiguous_type() == AnyAmbiguousAliases::M2 { + self.any_ambiguous().map(Monster::init_from_table) + } else { + None + } + } + + #[inline] + #[allow(non_snake_case)] + pub fn any_ambiguous_as_m3(&self) -> Option<Monster<'a>> { + if self.any_ambiguous_type() == AnyAmbiguousAliases::M3 { + self.any_ambiguous().map(Monster::init_from_table) + } else { + None + } + } + +} + +impl flatbuffers::Verifiable for Monster<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::<Vec3>("pos", Self::VT_POS, false)? + .visit_field::<i16>("mana", Self::VT_MANA, false)? + .visit_field::<i16>("hp", Self::VT_HP, false)? + .visit_field::<flatbuffers::ForwardsUOffset<&str>>("name", Self::VT_NAME, true)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, u8>>>("inventory", Self::VT_INVENTORY, false)? + .visit_field::<Color>("color", Self::VT_COLOR, false)? + .visit_union::<Any, _>("test_type", Self::VT_TEST_TYPE, "test", Self::VT_TEST, false, |key, v, pos| { + match key { + Any::Monster => v.verify_union_variant::<flatbuffers::ForwardsUOffset<Monster>>("Any::Monster", pos), + Any::TestSimpleTableWithEnum => v.verify_union_variant::<flatbuffers::ForwardsUOffset<TestSimpleTableWithEnum>>("Any::TestSimpleTableWithEnum", pos), + Any::MyGame_Example2_Monster => v.verify_union_variant::<flatbuffers::ForwardsUOffset<super::example_2::Monster>>("Any::MyGame_Example2_Monster", pos), + _ => Ok(()), + } + })? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, Test>>>("test4", Self::VT_TEST4, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>>>("testarrayofstring", Self::VT_TESTARRAYOFSTRING, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Monster>>>>("testarrayoftables", Self::VT_TESTARRAYOFTABLES, false)? + .visit_field::<flatbuffers::ForwardsUOffset<Monster>>("enemy", Self::VT_ENEMY, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, u8>>>("testnestedflatbuffer", Self::VT_TESTNESTEDFLATBUFFER, false)? + .visit_field::<flatbuffers::ForwardsUOffset<Stat>>("testempty", Self::VT_TESTEMPTY, false)? + .visit_field::<bool>("testbool", Self::VT_TESTBOOL, false)? + .visit_field::<i32>("testhashs32_fnv1", Self::VT_TESTHASHS32_FNV1, false)? + .visit_field::<u32>("testhashu32_fnv1", Self::VT_TESTHASHU32_FNV1, false)? + .visit_field::<i64>("testhashs64_fnv1", Self::VT_TESTHASHS64_FNV1, false)? + .visit_field::<u64>("testhashu64_fnv1", Self::VT_TESTHASHU64_FNV1, false)? + .visit_field::<i32>("testhashs32_fnv1a", Self::VT_TESTHASHS32_FNV1A, false)? + .visit_field::<u32>("testhashu32_fnv1a", Self::VT_TESTHASHU32_FNV1A, false)? + .visit_field::<i64>("testhashs64_fnv1a", Self::VT_TESTHASHS64_FNV1A, false)? + .visit_field::<u64>("testhashu64_fnv1a", Self::VT_TESTHASHU64_FNV1A, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, bool>>>("testarrayofbools", Self::VT_TESTARRAYOFBOOLS, false)? + .visit_field::<f32>("testf", Self::VT_TESTF, false)? + .visit_field::<f32>("testf2", Self::VT_TESTF2, false)? + .visit_field::<f32>("testf3", Self::VT_TESTF3, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<&'_ str>>>>("testarrayofstring2", Self::VT_TESTARRAYOFSTRING2, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, Ability>>>("testarrayofsortedstruct", Self::VT_TESTARRAYOFSORTEDSTRUCT, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, u8>>>("flex", Self::VT_FLEX, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, Test>>>("test5", Self::VT_TEST5, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, i64>>>("vector_of_longs", Self::VT_VECTOR_OF_LONGS, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, f64>>>("vector_of_doubles", Self::VT_VECTOR_OF_DOUBLES, false)? + .visit_field::<flatbuffers::ForwardsUOffset<super::InParentNamespace>>("parent_namespace_test", Self::VT_PARENT_NAMESPACE_TEST, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Referrable>>>>("vector_of_referrables", Self::VT_VECTOR_OF_REFERRABLES, false)? + .visit_field::<u64>("single_weak_reference", Self::VT_SINGLE_WEAK_REFERENCE, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, u64>>>("vector_of_weak_references", Self::VT_VECTOR_OF_WEAK_REFERENCES, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Referrable>>>>("vector_of_strong_referrables", Self::VT_VECTOR_OF_STRONG_REFERRABLES, false)? + .visit_field::<u64>("co_owning_reference", Self::VT_CO_OWNING_REFERENCE, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, u64>>>("vector_of_co_owning_references", Self::VT_VECTOR_OF_CO_OWNING_REFERENCES, false)? + .visit_field::<u64>("non_owning_reference", Self::VT_NON_OWNING_REFERENCE, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, u64>>>("vector_of_non_owning_references", Self::VT_VECTOR_OF_NON_OWNING_REFERENCES, false)? + .visit_union::<AnyUniqueAliases, _>("any_unique_type", Self::VT_ANY_UNIQUE_TYPE, "any_unique", Self::VT_ANY_UNIQUE, false, |key, v, pos| { + match key { + AnyUniqueAliases::M => v.verify_union_variant::<flatbuffers::ForwardsUOffset<Monster>>("AnyUniqueAliases::M", pos), + AnyUniqueAliases::TS => v.verify_union_variant::<flatbuffers::ForwardsUOffset<TestSimpleTableWithEnum>>("AnyUniqueAliases::TS", pos), + AnyUniqueAliases::M2 => v.verify_union_variant::<flatbuffers::ForwardsUOffset<super::example_2::Monster>>("AnyUniqueAliases::M2", pos), + _ => Ok(()), + } + })? + .visit_union::<AnyAmbiguousAliases, _>("any_ambiguous_type", Self::VT_ANY_AMBIGUOUS_TYPE, "any_ambiguous", Self::VT_ANY_AMBIGUOUS, false, |key, v, pos| { + match key { + AnyAmbiguousAliases::M1 => v.verify_union_variant::<flatbuffers::ForwardsUOffset<Monster>>("AnyAmbiguousAliases::M1", pos), + AnyAmbiguousAliases::M2 => v.verify_union_variant::<flatbuffers::ForwardsUOffset<Monster>>("AnyAmbiguousAliases::M2", pos), + AnyAmbiguousAliases::M3 => v.verify_union_variant::<flatbuffers::ForwardsUOffset<Monster>>("AnyAmbiguousAliases::M3", pos), + _ => Ok(()), + } + })? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, Color>>>("vector_of_enums", Self::VT_VECTOR_OF_ENUMS, false)? + .visit_field::<Race>("signed_enum", Self::VT_SIGNED_ENUM, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, u8>>>("testrequirednestedflatbuffer", Self::VT_TESTREQUIREDNESTEDFLATBUFFER, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, flatbuffers::ForwardsUOffset<Stat>>>>("scalar_key_sorted_tables", Self::VT_SCALAR_KEY_SORTED_TABLES, false)? + .finish(); + Ok(()) + } +} +pub struct MonsterArgs<'a> { + pub pos: Option<&'a Vec3>, + pub mana: i16, + pub hp: i16, + pub name: Option<flatbuffers::WIPOffset<&'a str>>, + pub inventory: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>, + pub color: Color, + pub test_type: Any, + pub test: Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>, + pub test4: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Test>>>, + pub testarrayofstring: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>>, + pub testarrayoftables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Monster<'a>>>>>, + pub enemy: Option<flatbuffers::WIPOffset<Monster<'a>>>, + pub testnestedflatbuffer: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>, + pub testempty: Option<flatbuffers::WIPOffset<Stat<'a>>>, + pub testbool: bool, + pub testhashs32_fnv1: i32, + pub testhashu32_fnv1: u32, + pub testhashs64_fnv1: i64, + pub testhashu64_fnv1: u64, + pub testhashs32_fnv1a: i32, + pub testhashu32_fnv1a: u32, + pub testhashs64_fnv1a: i64, + pub testhashu64_fnv1a: u64, + pub testarrayofbools: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, bool>>>, + pub testf: f32, + pub testf2: f32, + pub testf3: f32, + pub testarrayofstring2: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>>, + pub testarrayofsortedstruct: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Ability>>>, + pub flex: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>, + pub test5: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Test>>>, + pub vector_of_longs: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, i64>>>, + pub vector_of_doubles: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, f64>>>, + pub parent_namespace_test: Option<flatbuffers::WIPOffset<super::InParentNamespace<'a>>>, + pub vector_of_referrables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable<'a>>>>>, + pub single_weak_reference: u64, + pub vector_of_weak_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u64>>>, + pub vector_of_strong_referrables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable<'a>>>>>, + pub co_owning_reference: u64, + pub vector_of_co_owning_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u64>>>, + pub non_owning_reference: u64, + pub vector_of_non_owning_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u64>>>, + pub any_unique_type: AnyUniqueAliases, + pub any_unique: Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>, + pub any_ambiguous_type: AnyAmbiguousAliases, + pub any_ambiguous: Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>, + pub vector_of_enums: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Color>>>, + pub signed_enum: Race, + pub testrequirednestedflatbuffer: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>, + pub scalar_key_sorted_tables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Stat<'a>>>>>, +} +impl<'a> Default for MonsterArgs<'a> { + #[inline] + fn default() -> Self { + MonsterArgs { + pos: None, + mana: 150, + hp: 100, + name: None, // required field + inventory: None, + color: Color::Blue, + test_type: Any::NONE, + test: None, + test4: None, + testarrayofstring: None, + testarrayoftables: None, + enemy: None, + testnestedflatbuffer: None, + testempty: None, + testbool: false, + testhashs32_fnv1: 0, + testhashu32_fnv1: 0, + testhashs64_fnv1: 0, + testhashu64_fnv1: 0, + testhashs32_fnv1a: 0, + testhashu32_fnv1a: 0, + testhashs64_fnv1a: 0, + testhashu64_fnv1a: 0, + testarrayofbools: None, + testf: 3.14159, + testf2: 3.0, + testf3: 0.0, + testarrayofstring2: None, + testarrayofsortedstruct: None, + flex: None, + test5: None, + vector_of_longs: None, + vector_of_doubles: None, + parent_namespace_test: None, + vector_of_referrables: None, + single_weak_reference: 0, + vector_of_weak_references: None, + vector_of_strong_referrables: None, + co_owning_reference: 0, + vector_of_co_owning_references: None, + non_owning_reference: 0, + vector_of_non_owning_references: None, + any_unique_type: AnyUniqueAliases::NONE, + any_unique: None, + any_ambiguous_type: AnyAmbiguousAliases::NONE, + any_ambiguous: None, + vector_of_enums: None, + signed_enum: Race::None, + testrequirednestedflatbuffer: None, + scalar_key_sorted_tables: None, + } + } +} + +impl Serialize for Monster<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("Monster", 51)?; + if let Some(f) = self.pos() { + s.serialize_field("pos", &f)?; + } else { + s.skip_field("pos")?; + } + s.serialize_field("mana", &self.mana())?; + s.serialize_field("hp", &self.hp())?; + s.serialize_field("name", &self.name())?; + if let Some(f) = self.inventory() { + s.serialize_field("inventory", &f)?; + } else { + s.skip_field("inventory")?; + } + s.serialize_field("color", &self.color())?; + s.serialize_field("test_type", &self.test_type())?; + match self.test_type() { + Any::NONE => (), + Any::Monster => { + let f = self.test_as_monster() + .expect("Invalid union table, expected `Any::Monster`."); + s.serialize_field("test", &f)?; + } + Any::TestSimpleTableWithEnum => { + let f = self.test_as_test_simple_table_with_enum() + .expect("Invalid union table, expected `Any::TestSimpleTableWithEnum`."); + s.serialize_field("test", &f)?; + } + Any::MyGame_Example2_Monster => { + let f = self.test_as_my_game_example_2_monster() + .expect("Invalid union table, expected `Any::MyGame_Example2_Monster`."); + s.serialize_field("test", &f)?; + } + _ => unimplemented!(), + } + if let Some(f) = self.test4() { + s.serialize_field("test4", &f)?; + } else { + s.skip_field("test4")?; + } + if let Some(f) = self.testarrayofstring() { + s.serialize_field("testarrayofstring", &f)?; + } else { + s.skip_field("testarrayofstring")?; + } + if let Some(f) = self.testarrayoftables() { + s.serialize_field("testarrayoftables", &f)?; + } else { + s.skip_field("testarrayoftables")?; + } + if let Some(f) = self.enemy() { + s.serialize_field("enemy", &f)?; + } else { + s.skip_field("enemy")?; + } + if let Some(f) = self.testnestedflatbuffer() { + s.serialize_field("testnestedflatbuffer", &f)?; + } else { + s.skip_field("testnestedflatbuffer")?; + } + if let Some(f) = self.testempty() { + s.serialize_field("testempty", &f)?; + } else { + s.skip_field("testempty")?; + } + s.serialize_field("testbool", &self.testbool())?; + s.serialize_field("testhashs32_fnv1", &self.testhashs32_fnv1())?; + s.serialize_field("testhashu32_fnv1", &self.testhashu32_fnv1())?; + s.serialize_field("testhashs64_fnv1", &self.testhashs64_fnv1())?; + s.serialize_field("testhashu64_fnv1", &self.testhashu64_fnv1())?; + s.serialize_field("testhashs32_fnv1a", &self.testhashs32_fnv1a())?; + s.serialize_field("testhashu32_fnv1a", &self.testhashu32_fnv1a())?; + s.serialize_field("testhashs64_fnv1a", &self.testhashs64_fnv1a())?; + s.serialize_field("testhashu64_fnv1a", &self.testhashu64_fnv1a())?; + if let Some(f) = self.testarrayofbools() { + s.serialize_field("testarrayofbools", &f)?; + } else { + s.skip_field("testarrayofbools")?; + } + s.serialize_field("testf", &self.testf())?; + s.serialize_field("testf2", &self.testf2())?; + s.serialize_field("testf3", &self.testf3())?; + if let Some(f) = self.testarrayofstring2() { + s.serialize_field("testarrayofstring2", &f)?; + } else { + s.skip_field("testarrayofstring2")?; + } + if let Some(f) = self.testarrayofsortedstruct() { + s.serialize_field("testarrayofsortedstruct", &f)?; + } else { + s.skip_field("testarrayofsortedstruct")?; + } + if let Some(f) = self.flex() { + s.serialize_field("flex", &f)?; + } else { + s.skip_field("flex")?; + } + if let Some(f) = self.test5() { + s.serialize_field("test5", &f)?; + } else { + s.skip_field("test5")?; + } + if let Some(f) = self.vector_of_longs() { + s.serialize_field("vector_of_longs", &f)?; + } else { + s.skip_field("vector_of_longs")?; + } + if let Some(f) = self.vector_of_doubles() { + s.serialize_field("vector_of_doubles", &f)?; + } else { + s.skip_field("vector_of_doubles")?; + } + if let Some(f) = self.parent_namespace_test() { + s.serialize_field("parent_namespace_test", &f)?; + } else { + s.skip_field("parent_namespace_test")?; + } + if let Some(f) = self.vector_of_referrables() { + s.serialize_field("vector_of_referrables", &f)?; + } else { + s.skip_field("vector_of_referrables")?; + } + s.serialize_field("single_weak_reference", &self.single_weak_reference())?; + if let Some(f) = self.vector_of_weak_references() { + s.serialize_field("vector_of_weak_references", &f)?; + } else { + s.skip_field("vector_of_weak_references")?; + } + if let Some(f) = self.vector_of_strong_referrables() { + s.serialize_field("vector_of_strong_referrables", &f)?; + } else { + s.skip_field("vector_of_strong_referrables")?; + } + s.serialize_field("co_owning_reference", &self.co_owning_reference())?; + if let Some(f) = self.vector_of_co_owning_references() { + s.serialize_field("vector_of_co_owning_references", &f)?; + } else { + s.skip_field("vector_of_co_owning_references")?; + } + s.serialize_field("non_owning_reference", &self.non_owning_reference())?; + if let Some(f) = self.vector_of_non_owning_references() { + s.serialize_field("vector_of_non_owning_references", &f)?; + } else { + s.skip_field("vector_of_non_owning_references")?; + } + s.serialize_field("any_unique_type", &self.any_unique_type())?; + match self.any_unique_type() { + AnyUniqueAliases::NONE => (), + AnyUniqueAliases::M => { + let f = self.any_unique_as_m() + .expect("Invalid union table, expected `AnyUniqueAliases::M`."); + s.serialize_field("any_unique", &f)?; + } + AnyUniqueAliases::TS => { + let f = self.any_unique_as_ts() + .expect("Invalid union table, expected `AnyUniqueAliases::TS`."); + s.serialize_field("any_unique", &f)?; + } + AnyUniqueAliases::M2 => { + let f = self.any_unique_as_m2() + .expect("Invalid union table, expected `AnyUniqueAliases::M2`."); + s.serialize_field("any_unique", &f)?; + } + _ => unimplemented!(), + } + s.serialize_field("any_ambiguous_type", &self.any_ambiguous_type())?; + match self.any_ambiguous_type() { + AnyAmbiguousAliases::NONE => (), + AnyAmbiguousAliases::M1 => { + let f = self.any_ambiguous_as_m1() + .expect("Invalid union table, expected `AnyAmbiguousAliases::M1`."); + s.serialize_field("any_ambiguous", &f)?; + } + AnyAmbiguousAliases::M2 => { + let f = self.any_ambiguous_as_m2() + .expect("Invalid union table, expected `AnyAmbiguousAliases::M2`."); + s.serialize_field("any_ambiguous", &f)?; + } + AnyAmbiguousAliases::M3 => { + let f = self.any_ambiguous_as_m3() + .expect("Invalid union table, expected `AnyAmbiguousAliases::M3`."); + s.serialize_field("any_ambiguous", &f)?; + } + _ => unimplemented!(), + } + if let Some(f) = self.vector_of_enums() { + s.serialize_field("vector_of_enums", &f)?; + } else { + s.skip_field("vector_of_enums")?; + } + s.serialize_field("signed_enum", &self.signed_enum())?; + if let Some(f) = self.testrequirednestedflatbuffer() { + s.serialize_field("testrequirednestedflatbuffer", &f)?; + } else { + s.skip_field("testrequirednestedflatbuffer")?; + } + if let Some(f) = self.scalar_key_sorted_tables() { + s.serialize_field("scalar_key_sorted_tables", &f)?; + } else { + s.skip_field("scalar_key_sorted_tables")?; + } + s.end() + } +} + +pub struct MonsterBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> MonsterBuilder<'a, 'b> { + #[inline] + pub fn add_pos(&mut self, pos: &Vec3) { + self.fbb_.push_slot_always::<&Vec3>(Monster::VT_POS, pos); + } + #[inline] + pub fn add_mana(&mut self, mana: i16) { + self.fbb_.push_slot::<i16>(Monster::VT_MANA, mana, 150); + } + #[inline] + pub fn add_hp(&mut self, hp: i16) { + self.fbb_.push_slot::<i16>(Monster::VT_HP, hp, 100); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_NAME, name); + } + #[inline] + pub fn add_inventory(&mut self, inventory: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u8>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_INVENTORY, inventory); + } + #[inline] + pub fn add_color(&mut self, color: Color) { + self.fbb_.push_slot::<Color>(Monster::VT_COLOR, color, Color::Blue); + } + #[inline] + pub fn add_test_type(&mut self, test_type: Any) { + self.fbb_.push_slot::<Any>(Monster::VT_TEST_TYPE, test_type, Any::NONE); + } + #[inline] + pub fn add_test(&mut self, test: flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TEST, test); + } + #[inline] + pub fn add_test4(&mut self, test4: flatbuffers::WIPOffset<flatbuffers::Vector<'b , Test>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TEST4, test4); + } + #[inline] + pub fn add_testarrayofstring(&mut self, testarrayofstring: flatbuffers::WIPOffset<flatbuffers::Vector<'b , flatbuffers::ForwardsUOffset<&'b str>>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSTRING, testarrayofstring); + } + #[inline] + pub fn add_testarrayoftables(&mut self, testarrayoftables: flatbuffers::WIPOffset<flatbuffers::Vector<'b , flatbuffers::ForwardsUOffset<Monster<'b >>>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFTABLES, testarrayoftables); + } + #[inline] + pub fn add_enemy(&mut self, enemy: flatbuffers::WIPOffset<Monster<'b >>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<Monster>>(Monster::VT_ENEMY, enemy); + } + #[inline] + pub fn add_testnestedflatbuffer(&mut self, testnestedflatbuffer: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u8>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer); + } + #[inline] + pub fn add_testempty(&mut self, testempty: flatbuffers::WIPOffset<Stat<'b >>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<Stat>>(Monster::VT_TESTEMPTY, testempty); + } + #[inline] + pub fn add_testbool(&mut self, testbool: bool) { + self.fbb_.push_slot::<bool>(Monster::VT_TESTBOOL, testbool, false); + } + #[inline] + pub fn add_testhashs32_fnv1(&mut self, testhashs32_fnv1: i32) { + self.fbb_.push_slot::<i32>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0); + } + #[inline] + pub fn add_testhashu32_fnv1(&mut self, testhashu32_fnv1: u32) { + self.fbb_.push_slot::<u32>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0); + } + #[inline] + pub fn add_testhashs64_fnv1(&mut self, testhashs64_fnv1: i64) { + self.fbb_.push_slot::<i64>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0); + } + #[inline] + pub fn add_testhashu64_fnv1(&mut self, testhashu64_fnv1: u64) { + self.fbb_.push_slot::<u64>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0); + } + #[inline] + pub fn add_testhashs32_fnv1a(&mut self, testhashs32_fnv1a: i32) { + self.fbb_.push_slot::<i32>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0); + } + #[inline] + pub fn add_testhashu32_fnv1a(&mut self, testhashu32_fnv1a: u32) { + self.fbb_.push_slot::<u32>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0); + } + #[inline] + pub fn add_testhashs64_fnv1a(&mut self, testhashs64_fnv1a: i64) { + self.fbb_.push_slot::<i64>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0); + } + #[inline] + pub fn add_testhashu64_fnv1a(&mut self, testhashu64_fnv1a: u64) { + self.fbb_.push_slot::<u64>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0); + } + #[inline] + pub fn add_testarrayofbools(&mut self, testarrayofbools: flatbuffers::WIPOffset<flatbuffers::Vector<'b , bool>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools); + } + #[inline] + pub fn add_testf(&mut self, testf: f32) { + self.fbb_.push_slot::<f32>(Monster::VT_TESTF, testf, 3.14159); + } + #[inline] + pub fn add_testf2(&mut self, testf2: f32) { + self.fbb_.push_slot::<f32>(Monster::VT_TESTF2, testf2, 3.0); + } + #[inline] + pub fn add_testf3(&mut self, testf3: f32) { + self.fbb_.push_slot::<f32>(Monster::VT_TESTF3, testf3, 0.0); + } + #[inline] + pub fn add_testarrayofstring2(&mut self, testarrayofstring2: flatbuffers::WIPOffset<flatbuffers::Vector<'b , flatbuffers::ForwardsUOffset<&'b str>>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2); + } + #[inline] + pub fn add_testarrayofsortedstruct(&mut self, testarrayofsortedstruct: flatbuffers::WIPOffset<flatbuffers::Vector<'b , Ability>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct); + } + #[inline] + pub fn add_flex(&mut self, flex: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u8>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_FLEX, flex); + } + #[inline] + pub fn add_test5(&mut self, test5: flatbuffers::WIPOffset<flatbuffers::Vector<'b , Test>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TEST5, test5); + } + #[inline] + pub fn add_vector_of_longs(&mut self, vector_of_longs: flatbuffers::WIPOffset<flatbuffers::Vector<'b , i64>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_LONGS, vector_of_longs); + } + #[inline] + pub fn add_vector_of_doubles(&mut self, vector_of_doubles: flatbuffers::WIPOffset<flatbuffers::Vector<'b , f64>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles); + } + #[inline] + pub fn add_parent_namespace_test(&mut self, parent_namespace_test: flatbuffers::WIPOffset<super::InParentNamespace<'b >>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<super::InParentNamespace>>(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test); + } + #[inline] + pub fn add_vector_of_referrables(&mut self, vector_of_referrables: flatbuffers::WIPOffset<flatbuffers::Vector<'b , flatbuffers::ForwardsUOffset<Referrable<'b >>>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables); + } + #[inline] + pub fn add_single_weak_reference(&mut self, single_weak_reference: u64) { + self.fbb_.push_slot::<u64>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0); + } + #[inline] + pub fn add_vector_of_weak_references(&mut self, vector_of_weak_references: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u64>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references); + } + #[inline] + pub fn add_vector_of_strong_referrables(&mut self, vector_of_strong_referrables: flatbuffers::WIPOffset<flatbuffers::Vector<'b , flatbuffers::ForwardsUOffset<Referrable<'b >>>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables); + } + #[inline] + pub fn add_co_owning_reference(&mut self, co_owning_reference: u64) { + self.fbb_.push_slot::<u64>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0); + } + #[inline] + pub fn add_vector_of_co_owning_references(&mut self, vector_of_co_owning_references: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u64>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references); + } + #[inline] + pub fn add_non_owning_reference(&mut self, non_owning_reference: u64) { + self.fbb_.push_slot::<u64>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0); + } + #[inline] + pub fn add_vector_of_non_owning_references(&mut self, vector_of_non_owning_references: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u64>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references); + } + #[inline] + pub fn add_any_unique_type(&mut self, any_unique_type: AnyUniqueAliases) { + self.fbb_.push_slot::<AnyUniqueAliases>(Monster::VT_ANY_UNIQUE_TYPE, any_unique_type, AnyUniqueAliases::NONE); + } + #[inline] + pub fn add_any_unique(&mut self, any_unique: flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_ANY_UNIQUE, any_unique); + } + #[inline] + pub fn add_any_ambiguous_type(&mut self, any_ambiguous_type: AnyAmbiguousAliases) { + self.fbb_.push_slot::<AnyAmbiguousAliases>(Monster::VT_ANY_AMBIGUOUS_TYPE, any_ambiguous_type, AnyAmbiguousAliases::NONE); + } + #[inline] + pub fn add_any_ambiguous(&mut self, any_ambiguous: flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_ANY_AMBIGUOUS, any_ambiguous); + } + #[inline] + pub fn add_vector_of_enums(&mut self, vector_of_enums: flatbuffers::WIPOffset<flatbuffers::Vector<'b , Color>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums); + } + #[inline] + pub fn add_signed_enum(&mut self, signed_enum: Race) { + self.fbb_.push_slot::<Race>(Monster::VT_SIGNED_ENUM, signed_enum, Race::None); + } + #[inline] + pub fn add_testrequirednestedflatbuffer(&mut self, testrequirednestedflatbuffer: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u8>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer); + } + #[inline] + pub fn add_scalar_key_sorted_tables(&mut self, scalar_key_sorted_tables: flatbuffers::WIPOffset<flatbuffers::Vector<'b , flatbuffers::ForwardsUOffset<Stat<'b >>>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_SCALAR_KEY_SORTED_TABLES, scalar_key_sorted_tables); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> MonsterBuilder<'a, 'b> { + let start = _fbb.start_table(); + MonsterBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<Monster<'a>> { + let o = self.fbb_.end_table(self.start_); + self.fbb_.required(o, Monster::VT_NAME,"name"); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for Monster<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("Monster"); + ds.field("pos", &self.pos()); + ds.field("mana", &self.mana()); + ds.field("hp", &self.hp()); + ds.field("name", &self.name()); + ds.field("inventory", &self.inventory()); + ds.field("color", &self.color()); + ds.field("test_type", &self.test_type()); + match self.test_type() { + Any::Monster => { + if let Some(x) = self.test_as_monster() { + ds.field("test", &x) + } else { + ds.field("test", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + Any::TestSimpleTableWithEnum => { + if let Some(x) = self.test_as_test_simple_table_with_enum() { + ds.field("test", &x) + } else { + ds.field("test", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + Any::MyGame_Example2_Monster => { + if let Some(x) = self.test_as_my_game_example_2_monster() { + ds.field("test", &x) + } else { + ds.field("test", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + _ => { + let x: Option<()> = None; + ds.field("test", &x) + }, + }; + ds.field("test4", &self.test4()); + ds.field("testarrayofstring", &self.testarrayofstring()); + ds.field("testarrayoftables", &self.testarrayoftables()); + ds.field("enemy", &self.enemy()); + ds.field("testnestedflatbuffer", &self.testnestedflatbuffer()); + ds.field("testempty", &self.testempty()); + ds.field("testbool", &self.testbool()); + ds.field("testhashs32_fnv1", &self.testhashs32_fnv1()); + ds.field("testhashu32_fnv1", &self.testhashu32_fnv1()); + ds.field("testhashs64_fnv1", &self.testhashs64_fnv1()); + ds.field("testhashu64_fnv1", &self.testhashu64_fnv1()); + ds.field("testhashs32_fnv1a", &self.testhashs32_fnv1a()); + ds.field("testhashu32_fnv1a", &self.testhashu32_fnv1a()); + ds.field("testhashs64_fnv1a", &self.testhashs64_fnv1a()); + ds.field("testhashu64_fnv1a", &self.testhashu64_fnv1a()); + ds.field("testarrayofbools", &self.testarrayofbools()); + ds.field("testf", &self.testf()); + ds.field("testf2", &self.testf2()); + ds.field("testf3", &self.testf3()); + ds.field("testarrayofstring2", &self.testarrayofstring2()); + ds.field("testarrayofsortedstruct", &self.testarrayofsortedstruct()); + ds.field("flex", &self.flex()); + ds.field("test5", &self.test5()); + ds.field("vector_of_longs", &self.vector_of_longs()); + ds.field("vector_of_doubles", &self.vector_of_doubles()); + ds.field("parent_namespace_test", &self.parent_namespace_test()); + ds.field("vector_of_referrables", &self.vector_of_referrables()); + ds.field("single_weak_reference", &self.single_weak_reference()); + ds.field("vector_of_weak_references", &self.vector_of_weak_references()); + ds.field("vector_of_strong_referrables", &self.vector_of_strong_referrables()); + ds.field("co_owning_reference", &self.co_owning_reference()); + ds.field("vector_of_co_owning_references", &self.vector_of_co_owning_references()); + ds.field("non_owning_reference", &self.non_owning_reference()); + ds.field("vector_of_non_owning_references", &self.vector_of_non_owning_references()); + ds.field("any_unique_type", &self.any_unique_type()); + match self.any_unique_type() { + AnyUniqueAliases::M => { + if let Some(x) = self.any_unique_as_m() { + ds.field("any_unique", &x) + } else { + ds.field("any_unique", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + AnyUniqueAliases::TS => { + if let Some(x) = self.any_unique_as_ts() { + ds.field("any_unique", &x) + } else { + ds.field("any_unique", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + AnyUniqueAliases::M2 => { + if let Some(x) = self.any_unique_as_m2() { + ds.field("any_unique", &x) + } else { + ds.field("any_unique", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + _ => { + let x: Option<()> = None; + ds.field("any_unique", &x) + }, + }; + ds.field("any_ambiguous_type", &self.any_ambiguous_type()); + match self.any_ambiguous_type() { + AnyAmbiguousAliases::M1 => { + if let Some(x) = self.any_ambiguous_as_m1() { + ds.field("any_ambiguous", &x) + } else { + ds.field("any_ambiguous", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + AnyAmbiguousAliases::M2 => { + if let Some(x) = self.any_ambiguous_as_m2() { + ds.field("any_ambiguous", &x) + } else { + ds.field("any_ambiguous", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + AnyAmbiguousAliases::M3 => { + if let Some(x) = self.any_ambiguous_as_m3() { + ds.field("any_ambiguous", &x) + } else { + ds.field("any_ambiguous", &"InvalidFlatbuffer: Union discriminant does not match value.") + } + }, + _ => { + let x: Option<()> = None; + ds.field("any_ambiguous", &x) + }, + }; + ds.field("vector_of_enums", &self.vector_of_enums()); + ds.field("signed_enum", &self.signed_enum()); + ds.field("testrequirednestedflatbuffer", &self.testrequirednestedflatbuffer()); + ds.field("scalar_key_sorted_tables", &self.scalar_key_sorted_tables()); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct MonsterT { + pub pos: Option<Vec3T>, + pub mana: i16, + pub hp: i16, + pub name: String, + pub inventory: Option<Vec<u8>>, + pub color: Color, + pub test: AnyT, + pub test4: Option<Vec<TestT>>, + pub testarrayofstring: Option<Vec<String>>, + pub testarrayoftables: Option<Vec<MonsterT>>, + pub enemy: Option<Box<MonsterT>>, + pub testnestedflatbuffer: Option<Vec<u8>>, + pub testempty: Option<Box<StatT>>, + pub testbool: bool, + pub testhashs32_fnv1: i32, + pub testhashu32_fnv1: u32, + pub testhashs64_fnv1: i64, + pub testhashu64_fnv1: u64, + pub testhashs32_fnv1a: i32, + pub testhashu32_fnv1a: u32, + pub testhashs64_fnv1a: i64, + pub testhashu64_fnv1a: u64, + pub testarrayofbools: Option<Vec<bool>>, + pub testf: f32, + pub testf2: f32, + pub testf3: f32, + pub testarrayofstring2: Option<Vec<String>>, + pub testarrayofsortedstruct: Option<Vec<AbilityT>>, + pub flex: Option<Vec<u8>>, + pub test5: Option<Vec<TestT>>, + pub vector_of_longs: Option<Vec<i64>>, + pub vector_of_doubles: Option<Vec<f64>>, + pub parent_namespace_test: Option<Box<super::InParentNamespaceT>>, + pub vector_of_referrables: Option<Vec<ReferrableT>>, + pub single_weak_reference: u64, + pub vector_of_weak_references: Option<Vec<u64>>, + pub vector_of_strong_referrables: Option<Vec<ReferrableT>>, + pub co_owning_reference: u64, + pub vector_of_co_owning_references: Option<Vec<u64>>, + pub non_owning_reference: u64, + pub vector_of_non_owning_references: Option<Vec<u64>>, + pub any_unique: AnyUniqueAliasesT, + pub any_ambiguous: AnyAmbiguousAliasesT, + pub vector_of_enums: Option<Vec<Color>>, + pub signed_enum: Race, + pub testrequirednestedflatbuffer: Option<Vec<u8>>, + pub scalar_key_sorted_tables: Option<Vec<StatT>>, +} +impl Default for MonsterT { + fn default() -> Self { + Self { + pos: None, + mana: 150, + hp: 100, + name: "".to_string(), + inventory: None, + color: Color::Blue, + test: AnyT::NONE, + test4: None, + testarrayofstring: None, + testarrayoftables: None, + enemy: None, + testnestedflatbuffer: None, + testempty: None, + testbool: false, + testhashs32_fnv1: 0, + testhashu32_fnv1: 0, + testhashs64_fnv1: 0, + testhashu64_fnv1: 0, + testhashs32_fnv1a: 0, + testhashu32_fnv1a: 0, + testhashs64_fnv1a: 0, + testhashu64_fnv1a: 0, + testarrayofbools: None, + testf: 3.14159, + testf2: 3.0, + testf3: 0.0, + testarrayofstring2: None, + testarrayofsortedstruct: None, + flex: None, + test5: None, + vector_of_longs: None, + vector_of_doubles: None, + parent_namespace_test: None, + vector_of_referrables: None, + single_weak_reference: 0, + vector_of_weak_references: None, + vector_of_strong_referrables: None, + co_owning_reference: 0, + vector_of_co_owning_references: None, + non_owning_reference: 0, + vector_of_non_owning_references: None, + any_unique: AnyUniqueAliasesT::NONE, + any_ambiguous: AnyAmbiguousAliasesT::NONE, + vector_of_enums: None, + signed_enum: Race::None, + testrequirednestedflatbuffer: None, + scalar_key_sorted_tables: None, + } + } +} +impl MonsterT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<Monster<'b>> { + let pos_tmp = self.pos.as_ref().map(|x| x.pack()); + let pos = pos_tmp.as_ref(); + let mana = self.mana; + let hp = self.hp; + let name = Some({ + let x = &self.name; + _fbb.create_string(x) + }); + let inventory = self.inventory.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let color = self.color; + let test_type = self.test.any_type(); + let test = self.test.pack(_fbb); + let test4 = self.test4.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w) + }); + let testarrayofstring = self.testarrayofstring.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|s| s.as_ref()).collect();_fbb.create_vector_of_strings(&w) + }); + let testarrayoftables = self.testarrayoftables.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w) + }); + let enemy = self.enemy.as_ref().map(|x|{ + x.pack(_fbb) + }); + let testnestedflatbuffer = self.testnestedflatbuffer.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let testempty = self.testempty.as_ref().map(|x|{ + x.pack(_fbb) + }); + let testbool = self.testbool; + let testhashs32_fnv1 = self.testhashs32_fnv1; + let testhashu32_fnv1 = self.testhashu32_fnv1; + let testhashs64_fnv1 = self.testhashs64_fnv1; + let testhashu64_fnv1 = self.testhashu64_fnv1; + let testhashs32_fnv1a = self.testhashs32_fnv1a; + let testhashu32_fnv1a = self.testhashu32_fnv1a; + let testhashs64_fnv1a = self.testhashs64_fnv1a; + let testhashu64_fnv1a = self.testhashu64_fnv1a; + let testarrayofbools = self.testarrayofbools.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let testf = self.testf; + let testf2 = self.testf2; + let testf3 = self.testf3; + let testarrayofstring2 = self.testarrayofstring2.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|s| s.as_ref()).collect();_fbb.create_vector_of_strings(&w) + }); + let testarrayofsortedstruct = self.testarrayofsortedstruct.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w) + }); + let flex = self.flex.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let test5 = self.test5.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|t| t.pack()).collect();_fbb.create_vector(&w) + }); + let vector_of_longs = self.vector_of_longs.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let vector_of_doubles = self.vector_of_doubles.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let parent_namespace_test = self.parent_namespace_test.as_ref().map(|x|{ + x.pack(_fbb) + }); + let vector_of_referrables = self.vector_of_referrables.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w) + }); + let single_weak_reference = self.single_weak_reference; + let vector_of_weak_references = self.vector_of_weak_references.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let vector_of_strong_referrables = self.vector_of_strong_referrables.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w) + }); + let co_owning_reference = self.co_owning_reference; + let vector_of_co_owning_references = self.vector_of_co_owning_references.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let non_owning_reference = self.non_owning_reference; + let vector_of_non_owning_references = self.vector_of_non_owning_references.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let any_unique_type = self.any_unique.any_unique_aliases_type(); + let any_unique = self.any_unique.pack(_fbb); + let any_ambiguous_type = self.any_ambiguous.any_ambiguous_aliases_type(); + let any_ambiguous = self.any_ambiguous.pack(_fbb); + let vector_of_enums = self.vector_of_enums.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let signed_enum = self.signed_enum; + let testrequirednestedflatbuffer = self.testrequirednestedflatbuffer.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let scalar_key_sorted_tables = self.scalar_key_sorted_tables.as_ref().map(|x|{ + let w: Vec<_> = x.iter().map(|t| t.pack(_fbb)).collect();_fbb.create_vector(&w) + }); + Monster::create(_fbb, &MonsterArgs{ + pos, + mana, + hp, + name, + inventory, + color, + test_type, + test, + test4, + testarrayofstring, + testarrayoftables, + enemy, + testnestedflatbuffer, + testempty, + testbool, + testhashs32_fnv1, + testhashu32_fnv1, + testhashs64_fnv1, + testhashu64_fnv1, + testhashs32_fnv1a, + testhashu32_fnv1a, + testhashs64_fnv1a, + testhashu64_fnv1a, + testarrayofbools, + testf, + testf2, + testf3, + testarrayofstring2, + testarrayofsortedstruct, + flex, + test5, + vector_of_longs, + vector_of_doubles, + parent_namespace_test, + vector_of_referrables, + single_weak_reference, + vector_of_weak_references, + vector_of_strong_referrables, + co_owning_reference, + vector_of_co_owning_references, + non_owning_reference, + vector_of_non_owning_references, + any_unique_type, + any_unique, + any_ambiguous_type, + any_ambiguous, + vector_of_enums, + signed_enum, + testrequirednestedflatbuffer, + scalar_key_sorted_tables, + }) + } +} +#[inline] +#[deprecated(since="2.0.0", note="Deprecated in favor of `root_as...` methods.")] +pub fn get_root_as_monster<'a>(buf: &'a [u8]) -> Monster<'a> { + unsafe { flatbuffers::root_unchecked::<Monster<'a>>(buf) } +} + +#[inline] +#[deprecated(since="2.0.0", note="Deprecated in favor of `root_as...` methods.")] +pub fn get_size_prefixed_root_as_monster<'a>(buf: &'a [u8]) -> Monster<'a> { + unsafe { flatbuffers::size_prefixed_root_unchecked::<Monster<'a>>(buf) } +} + +#[inline] +/// Verifies that a buffer of bytes contains a `Monster` +/// and returns it. +/// Note that verification is still experimental and may not +/// catch every error, or be maximally performant. For the +/// previous, unchecked, behavior use +/// `root_as_monster_unchecked`. +pub fn root_as_monster(buf: &[u8]) -> Result<Monster, flatbuffers::InvalidFlatbuffer> { + flatbuffers::root::<Monster>(buf) +} +#[inline] +/// Verifies that a buffer of bytes contains a size prefixed +/// `Monster` and returns it. +/// Note that verification is still experimental and may not +/// catch every error, or be maximally performant. For the +/// previous, unchecked, behavior use +/// `size_prefixed_root_as_monster_unchecked`. +pub fn size_prefixed_root_as_monster(buf: &[u8]) -> Result<Monster, flatbuffers::InvalidFlatbuffer> { + flatbuffers::size_prefixed_root::<Monster>(buf) +} +#[inline] +/// Verifies, with the given options, that a buffer of bytes +/// contains a `Monster` and returns it. +/// Note that verification is still experimental and may not +/// catch every error, or be maximally performant. For the +/// previous, unchecked, behavior use +/// `root_as_monster_unchecked`. +pub fn root_as_monster_with_opts<'b, 'o>( + opts: &'o flatbuffers::VerifierOptions, + buf: &'b [u8], +) -> Result<Monster<'b>, flatbuffers::InvalidFlatbuffer> { + flatbuffers::root_with_opts::<Monster<'b>>(opts, buf) +} +#[inline] +/// Verifies, with the given verifier options, that a buffer of +/// bytes contains a size prefixed `Monster` and returns +/// it. Note that verification is still experimental and may not +/// catch every error, or be maximally performant. For the +/// previous, unchecked, behavior use +/// `root_as_monster_unchecked`. +pub fn size_prefixed_root_as_monster_with_opts<'b, 'o>( + opts: &'o flatbuffers::VerifierOptions, + buf: &'b [u8], +) -> Result<Monster<'b>, flatbuffers::InvalidFlatbuffer> { + flatbuffers::size_prefixed_root_with_opts::<Monster<'b>>(opts, buf) +} +#[inline] +/// Assumes, without verification, that a buffer of bytes contains a Monster and returns it. +/// # Safety +/// Callers must trust the given bytes do indeed contain a valid `Monster`. +pub unsafe fn root_as_monster_unchecked(buf: &[u8]) -> Monster { + flatbuffers::root_unchecked::<Monster>(buf) +} +#[inline] +/// Assumes, without verification, that a buffer of bytes contains a size prefixed Monster and returns it. +/// # Safety +/// Callers must trust the given bytes do indeed contain a valid size prefixed `Monster`. +pub unsafe fn size_prefixed_root_as_monster_unchecked(buf: &[u8]) -> Monster { + flatbuffers::size_prefixed_root_unchecked::<Monster>(buf) +} +pub const MONSTER_IDENTIFIER: &str = "MONS"; + +#[inline] +pub fn monster_buffer_has_identifier(buf: &[u8]) -> bool { + flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, false) +} + +#[inline] +pub fn monster_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool { + flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, true) +} + +pub const MONSTER_EXTENSION: &str = "mon"; + +#[inline] +pub fn finish_monster_buffer<'a, 'b>( + fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>, + root: flatbuffers::WIPOffset<Monster<'a>>) { + fbb.finish(root, Some(MONSTER_IDENTIFIER)); +} + +#[inline] +pub fn finish_size_prefixed_monster_buffer<'a, 'b>(fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>, root: flatbuffers::WIPOffset<Monster<'a>>) { + fbb.finish_size_prefixed(root, Some(MONSTER_IDENTIFIER)); +} diff --git a/tests/monster_test_serialize/my_game/example/race_generated.rs b/tests/monster_test_serialize/my_game/example/race_generated.rs new file mode 100644 index 00000000..63754ff9 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/race_generated.rs @@ -0,0 +1,112 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +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_RACE: i8 = -1; +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +pub const ENUM_MAX_RACE: i8 = 2; +#[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_RACE: [Race; 4] = [ + Race::None, + Race::Human, + Race::Dwarf, + Race::Elf, +]; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +#[repr(transparent)] +pub struct Race(pub i8); +#[allow(non_upper_case_globals)] +impl Race { + pub const None: Self = Self(-1); + pub const Human: Self = Self(0); + pub const Dwarf: Self = Self(1); + pub const Elf: Self = Self(2); + + pub const ENUM_MIN: i8 = -1; + pub const ENUM_MAX: i8 = 2; + pub const ENUM_VALUES: &'static [Self] = &[ + Self::None, + Self::Human, + Self::Dwarf, + Self::Elf, + ]; + /// Returns the variant's name or "" if unknown. + pub fn variant_name(self) -> Option<&'static str> { + match self { + Self::None => Some("None"), + Self::Human => Some("Human"), + Self::Dwarf => Some("Dwarf"), + Self::Elf => Some("Elf"), + _ => None, + } + } +} +impl std::fmt::Debug for Race { + 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 Serialize for Race { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_unit_variant("Race", self.0 as u32, self.variant_name().unwrap()) + } +} + +impl<'a> flatbuffers::Follow<'a> for Race { + type Inner = Self; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + let b = unsafe { + flatbuffers::read_scalar_at::<i8>(buf, loc) + }; + Self(b) + } +} + +impl flatbuffers::Push for Race { + type Output = Race; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + unsafe { flatbuffers::emplace_scalar::<i8>(dst, self.0); } + } +} + +impl flatbuffers::EndianScalar for Race { + #[inline] + fn to_little_endian(self) -> Self { + let b = i8::to_le(self.0); + Self(b) + } + #[inline] + #[allow(clippy::wrong_self_convention)] + fn from_little_endian(self) -> Self { + let b = i8::from_le(self.0); + Self(b) + } +} + +impl<'a> flatbuffers::Verifiable for Race { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + i8::run_verifier(v, pos) + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Race {} diff --git a/tests/monster_test_serialize/my_game/example/referrable_generated.rs b/tests/monster_test_serialize/my_game/example/referrable_generated.rs new file mode 100644 index 00000000..490980d0 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/referrable_generated.rs @@ -0,0 +1,156 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum ReferrableOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct Referrable<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for Referrable<'a> { + type Inner = Referrable<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> Referrable<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.Referrable" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + Referrable { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + args: &'args ReferrableArgs + ) -> flatbuffers::WIPOffset<Referrable<'bldr>> { + let mut builder = ReferrableBuilder::new(_fbb); + builder.add_id(args.id); + builder.finish() + } + + pub fn unpack(&self) -> ReferrableT { + let id = self.id(); + ReferrableT { + id, + } + } + + #[inline] + pub fn id(&self) -> u64 { + self._tab.get::<u64>(Referrable::VT_ID, Some(0)).unwrap() + } + #[inline] + pub fn key_compare_less_than(&self, o: &Referrable) -> bool { + self.id() < o.id() + } + + #[inline] + pub fn key_compare_with_value(&self, val: u64) -> ::std::cmp::Ordering { + let key = self.id(); + key.cmp(&val) + } +} + +impl flatbuffers::Verifiable for Referrable<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::<u64>("id", Self::VT_ID, false)? + .finish(); + Ok(()) + } +} +pub struct ReferrableArgs { + pub id: u64, +} +impl<'a> Default for ReferrableArgs { + #[inline] + fn default() -> Self { + ReferrableArgs { + id: 0, + } + } +} + +impl Serialize for Referrable<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("Referrable", 1)?; + s.serialize_field("id", &self.id())?; + s.end() + } +} + +pub struct ReferrableBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> ReferrableBuilder<'a, 'b> { + #[inline] + pub fn add_id(&mut self, id: u64) { + self.fbb_.push_slot::<u64>(Referrable::VT_ID, id, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> ReferrableBuilder<'a, 'b> { + let start = _fbb.start_table(); + ReferrableBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<Referrable<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for Referrable<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("Referrable"); + ds.field("id", &self.id()); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct ReferrableT { + pub id: u64, +} +impl Default for ReferrableT { + fn default() -> Self { + Self { + id: 0, + } + } +} +impl ReferrableT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<Referrable<'b>> { + let id = self.id; + Referrable::create(_fbb, &ReferrableArgs{ + id, + }) + } +} diff --git a/tests/monster_test_serialize/my_game/example/stat_generated.rs b/tests/monster_test_serialize/my_game/example/stat_generated.rs new file mode 100644 index 00000000..abfa05d1 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/stat_generated.rs @@ -0,0 +1,206 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum StatOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct Stat<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for Stat<'a> { + type Inner = Stat<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> Stat<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_VAL: flatbuffers::VOffsetT = 6; + pub const VT_COUNT: flatbuffers::VOffsetT = 8; + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.Stat" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + Stat { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + args: &'args StatArgs<'args> + ) -> flatbuffers::WIPOffset<Stat<'bldr>> { + let mut builder = StatBuilder::new(_fbb); + builder.add_val(args.val); + if let Some(x) = args.id { builder.add_id(x); } + builder.add_count(args.count); + builder.finish() + } + + pub fn unpack(&self) -> StatT { + let id = self.id().map(|x| { + x.to_string() + }); + let val = self.val(); + let count = self.count(); + StatT { + id, + val, + count, + } + } + + #[inline] + pub fn id(&self) -> Option<&'a str> { + self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(Stat::VT_ID, None) + } + #[inline] + pub fn val(&self) -> i64 { + self._tab.get::<i64>(Stat::VT_VAL, Some(0)).unwrap() + } + #[inline] + pub fn count(&self) -> u16 { + self._tab.get::<u16>(Stat::VT_COUNT, Some(0)).unwrap() + } + #[inline] + pub fn key_compare_less_than(&self, o: &Stat) -> bool { + self.count() < o.count() + } + + #[inline] + pub fn key_compare_with_value(&self, val: u16) -> ::std::cmp::Ordering { + let key = self.count(); + key.cmp(&val) + } +} + +impl flatbuffers::Verifiable for Stat<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::<flatbuffers::ForwardsUOffset<&str>>("id", Self::VT_ID, false)? + .visit_field::<i64>("val", Self::VT_VAL, false)? + .visit_field::<u16>("count", Self::VT_COUNT, false)? + .finish(); + Ok(()) + } +} +pub struct StatArgs<'a> { + pub id: Option<flatbuffers::WIPOffset<&'a str>>, + pub val: i64, + pub count: u16, +} +impl<'a> Default for StatArgs<'a> { + #[inline] + fn default() -> Self { + StatArgs { + id: None, + val: 0, + count: 0, + } + } +} + +impl Serialize for Stat<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("Stat", 3)?; + if let Some(f) = self.id() { + s.serialize_field("id", &f)?; + } else { + s.skip_field("id")?; + } + s.serialize_field("val", &self.val())?; + s.serialize_field("count", &self.count())?; + s.end() + } +} + +pub struct StatBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> StatBuilder<'a, 'b> { + #[inline] + pub fn add_id(&mut self, id: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Stat::VT_ID, id); + } + #[inline] + pub fn add_val(&mut self, val: i64) { + self.fbb_.push_slot::<i64>(Stat::VT_VAL, val, 0); + } + #[inline] + pub fn add_count(&mut self, count: u16) { + self.fbb_.push_slot::<u16>(Stat::VT_COUNT, count, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> StatBuilder<'a, 'b> { + let start = _fbb.start_table(); + StatBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<Stat<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for Stat<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("Stat"); + ds.field("id", &self.id()); + ds.field("val", &self.val()); + ds.field("count", &self.count()); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct StatT { + pub id: Option<String>, + pub val: i64, + pub count: u16, +} +impl Default for StatT { + fn default() -> Self { + Self { + id: None, + val: 0, + count: 0, + } + } +} +impl StatT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<Stat<'b>> { + let id = self.id.as_ref().map(|x|{ + _fbb.create_string(x) + }); + let val = self.val; + let count = self.count; + Stat::create(_fbb, &StatArgs{ + id, + val, + count, + }) + } +} diff --git a/tests/monster_test_serialize/my_game/example/struct_of_structs_generated.rs b/tests/monster_test_serialize/my_game/example/struct_of_structs_generated.rs new file mode 100644 index 00000000..75b8865c --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/struct_of_structs_generated.rs @@ -0,0 +1,158 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +// struct StructOfStructs, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct StructOfStructs(pub [u8; 20]); +impl Default for StructOfStructs { + fn default() -> Self { + Self([0; 20]) + } +} +impl std::fmt::Debug for StructOfStructs { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct("StructOfStructs") + .field("a", &self.a()) + .field("b", &self.b()) + .field("c", &self.c()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for StructOfStructs {} +impl flatbuffers::SafeSliceAccess for StructOfStructs {} +impl<'a> flatbuffers::Follow<'a> for StructOfStructs { + type Inner = &'a StructOfStructs; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a StructOfStructs>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a StructOfStructs { + type Inner = &'a StructOfStructs; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::<StructOfStructs>(buf, loc) + } +} +impl<'b> flatbuffers::Push for StructOfStructs { + type Output = StructOfStructs; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(self as *const StructOfStructs as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} +impl<'b> flatbuffers::Push for &'b StructOfStructs { + type Output = StructOfStructs; + + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(*self as *const StructOfStructs as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} + +impl<'a> flatbuffers::Verifiable for StructOfStructs { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::<Self>(pos) + } +} + +impl Serialize for StructOfStructs { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("StructOfStructs", 3)?; + s.serialize_field("a", &self.a())?; + s.serialize_field("b", &self.b())?; + s.serialize_field("c", &self.c())?; + s.end() + } +} + +impl<'a> StructOfStructs { + #[allow(clippy::too_many_arguments)] + pub fn new( + a: &Ability, + b: &Test, + c: &Ability, + ) -> Self { + let mut s = Self([0; 20]); + s.set_a(a); + s.set_b(b); + s.set_c(c); + s + } + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.StructOfStructs" + } + + pub fn a(&self) -> &Ability { + unsafe { &*(self.0[0..].as_ptr() as *const Ability) } + } + + #[allow(clippy::identity_op)] + pub fn set_a(&mut self, x: &Ability) { + self.0[0..0 + 8].copy_from_slice(&x.0) + } + + pub fn b(&self) -> &Test { + unsafe { &*(self.0[8..].as_ptr() as *const Test) } + } + + #[allow(clippy::identity_op)] + pub fn set_b(&mut self, x: &Test) { + self.0[8..8 + 4].copy_from_slice(&x.0) + } + + pub fn c(&self) -> &Ability { + unsafe { &*(self.0[12..].as_ptr() as *const Ability) } + } + + #[allow(clippy::identity_op)] + pub fn set_c(&mut self, x: &Ability) { + self.0[12..12 + 8].copy_from_slice(&x.0) + } + + pub fn unpack(&self) -> StructOfStructsT { + StructOfStructsT { + a: self.a().unpack(), + b: self.b().unpack(), + c: self.c().unpack(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Default)] +pub struct StructOfStructsT { + pub a: AbilityT, + pub b: TestT, + pub c: AbilityT, +} +impl StructOfStructsT { + pub fn pack(&self) -> StructOfStructs { + StructOfStructs::new( + &self.a.pack(), + &self.b.pack(), + &self.c.pack(), + ) + } +} + diff --git a/tests/monster_test_serialize/my_game/example/test_generated.rs b/tests/monster_test_serialize/my_game/example/test_generated.rs new file mode 100644 index 00000000..56493ba1 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/test_generated.rs @@ -0,0 +1,170 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +// struct Test, aligned to 2 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct Test(pub [u8; 4]); +impl Default for Test { + fn default() -> Self { + Self([0; 4]) + } +} +impl std::fmt::Debug for Test { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct("Test") + .field("a", &self.a()) + .field("b", &self.b()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Test {} +impl flatbuffers::SafeSliceAccess for Test {} +impl<'a> flatbuffers::Follow<'a> for Test { + type Inner = &'a Test; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a Test>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a Test { + type Inner = &'a Test; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::<Test>(buf, loc) + } +} +impl<'b> flatbuffers::Push for Test { + type Output = Test; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(self as *const Test as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} +impl<'b> flatbuffers::Push for &'b Test { + type Output = Test; + + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(*self as *const Test as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} + +impl<'a> flatbuffers::Verifiable for Test { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::<Self>(pos) + } +} + +impl Serialize for Test { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("Test", 2)?; + s.serialize_field("a", &self.a())?; + s.serialize_field("b", &self.b())?; + s.end() + } +} + +impl<'a> Test { + #[allow(clippy::too_many_arguments)] + pub fn new( + a: i16, + b: i8, + ) -> Self { + let mut s = Self([0; 4]); + s.set_a(a); + s.set_b(b); + s + } + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.Test" + } + + pub fn a(&self) -> i16 { + let mut mem = core::mem::MaybeUninit::<i16>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<i16>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_a(&mut self, x: i16) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const i16 as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<i16>(), + ); + } + } + + pub fn b(&self) -> i8 { + let mut mem = core::mem::MaybeUninit::<i8>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[2..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<i8>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_b(&mut self, x: i8) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const i8 as *const u8, + self.0[2..].as_mut_ptr(), + core::mem::size_of::<i8>(), + ); + } + } + + pub fn unpack(&self) -> TestT { + TestT { + a: self.a(), + b: self.b(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Default)] +pub struct TestT { + pub a: i16, + pub b: i8, +} +impl TestT { + pub fn pack(&self) -> Test { + Test::new( + self.a, + self.b, + ) + } +} + diff --git a/tests/monster_test_serialize/my_game/example/test_simple_table_with_enum_generated.rs b/tests/monster_test_serialize/my_game/example/test_simple_table_with_enum_generated.rs new file mode 100644 index 00000000..cd643118 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/test_simple_table_with_enum_generated.rs @@ -0,0 +1,146 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum TestSimpleTableWithEnumOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct TestSimpleTableWithEnum<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for TestSimpleTableWithEnum<'a> { + type Inner = TestSimpleTableWithEnum<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> TestSimpleTableWithEnum<'a> { + pub const VT_COLOR: flatbuffers::VOffsetT = 4; + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.TestSimpleTableWithEnum" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + TestSimpleTableWithEnum { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + args: &'args TestSimpleTableWithEnumArgs + ) -> flatbuffers::WIPOffset<TestSimpleTableWithEnum<'bldr>> { + let mut builder = TestSimpleTableWithEnumBuilder::new(_fbb); + builder.add_color(args.color); + builder.finish() + } + + pub fn unpack(&self) -> TestSimpleTableWithEnumT { + let color = self.color(); + TestSimpleTableWithEnumT { + color, + } + } + + #[inline] + pub fn color(&self) -> Color { + self._tab.get::<Color>(TestSimpleTableWithEnum::VT_COLOR, Some(Color::Green)).unwrap() + } +} + +impl flatbuffers::Verifiable for TestSimpleTableWithEnum<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::<Color>("color", Self::VT_COLOR, false)? + .finish(); + Ok(()) + } +} +pub struct TestSimpleTableWithEnumArgs { + pub color: Color, +} +impl<'a> Default for TestSimpleTableWithEnumArgs { + #[inline] + fn default() -> Self { + TestSimpleTableWithEnumArgs { + color: Color::Green, + } + } +} + +impl Serialize for TestSimpleTableWithEnum<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("TestSimpleTableWithEnum", 1)?; + s.serialize_field("color", &self.color())?; + s.end() + } +} + +pub struct TestSimpleTableWithEnumBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> TestSimpleTableWithEnumBuilder<'a, 'b> { + #[inline] + pub fn add_color(&mut self, color: Color) { + self.fbb_.push_slot::<Color>(TestSimpleTableWithEnum::VT_COLOR, color, Color::Green); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> TestSimpleTableWithEnumBuilder<'a, 'b> { + let start = _fbb.start_table(); + TestSimpleTableWithEnumBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<TestSimpleTableWithEnum<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for TestSimpleTableWithEnum<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("TestSimpleTableWithEnum"); + ds.field("color", &self.color()); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct TestSimpleTableWithEnumT { + pub color: Color, +} +impl Default for TestSimpleTableWithEnumT { + fn default() -> Self { + Self { + color: Color::Green, + } + } +} +impl TestSimpleTableWithEnumT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<TestSimpleTableWithEnum<'b>> { + let color = self.color; + TestSimpleTableWithEnum::create(_fbb, &TestSimpleTableWithEnumArgs{ + color, + }) + } +} diff --git a/tests/monster_test_serialize/my_game/example/type_aliases_generated.rs b/tests/monster_test_serialize/my_game/example/type_aliases_generated.rs new file mode 100644 index 00000000..44d11983 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/type_aliases_generated.rs @@ -0,0 +1,393 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum TypeAliasesOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct TypeAliases<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for TypeAliases<'a> { + type Inner = TypeAliases<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> TypeAliases<'a> { + pub const VT_I8_: flatbuffers::VOffsetT = 4; + pub const VT_U8_: flatbuffers::VOffsetT = 6; + pub const VT_I16_: flatbuffers::VOffsetT = 8; + pub const VT_U16_: flatbuffers::VOffsetT = 10; + pub const VT_I32_: flatbuffers::VOffsetT = 12; + pub const VT_U32_: flatbuffers::VOffsetT = 14; + pub const VT_I64_: flatbuffers::VOffsetT = 16; + pub const VT_U64_: flatbuffers::VOffsetT = 18; + pub const VT_F32_: flatbuffers::VOffsetT = 20; + pub const VT_F64_: flatbuffers::VOffsetT = 22; + pub const VT_V8: flatbuffers::VOffsetT = 24; + pub const VT_VF64: flatbuffers::VOffsetT = 26; + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.TypeAliases" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + TypeAliases { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + args: &'args TypeAliasesArgs<'args> + ) -> flatbuffers::WIPOffset<TypeAliases<'bldr>> { + let mut builder = TypeAliasesBuilder::new(_fbb); + builder.add_f64_(args.f64_); + builder.add_u64_(args.u64_); + builder.add_i64_(args.i64_); + if let Some(x) = args.vf64 { builder.add_vf64(x); } + if let Some(x) = args.v8 { builder.add_v8(x); } + builder.add_f32_(args.f32_); + builder.add_u32_(args.u32_); + builder.add_i32_(args.i32_); + builder.add_u16_(args.u16_); + builder.add_i16_(args.i16_); + builder.add_u8_(args.u8_); + builder.add_i8_(args.i8_); + builder.finish() + } + + pub fn unpack(&self) -> TypeAliasesT { + let i8_ = self.i8_(); + let u8_ = self.u8_(); + let i16_ = self.i16_(); + let u16_ = self.u16_(); + let i32_ = self.i32_(); + let u32_ = self.u32_(); + let i64_ = self.i64_(); + let u64_ = self.u64_(); + let f32_ = self.f32_(); + let f64_ = self.f64_(); + let v8 = self.v8().map(|x| { + x.to_vec() + }); + let vf64 = self.vf64().map(|x| { + x.into_iter().collect() + }); + TypeAliasesT { + i8_, + u8_, + i16_, + u16_, + i32_, + u32_, + i64_, + u64_, + f32_, + f64_, + v8, + vf64, + } + } + + #[inline] + pub fn i8_(&self) -> i8 { + self._tab.get::<i8>(TypeAliases::VT_I8_, Some(0)).unwrap() + } + #[inline] + pub fn u8_(&self) -> u8 { + self._tab.get::<u8>(TypeAliases::VT_U8_, Some(0)).unwrap() + } + #[inline] + pub fn i16_(&self) -> i16 { + self._tab.get::<i16>(TypeAliases::VT_I16_, Some(0)).unwrap() + } + #[inline] + pub fn u16_(&self) -> u16 { + self._tab.get::<u16>(TypeAliases::VT_U16_, Some(0)).unwrap() + } + #[inline] + pub fn i32_(&self) -> i32 { + self._tab.get::<i32>(TypeAliases::VT_I32_, Some(0)).unwrap() + } + #[inline] + pub fn u32_(&self) -> u32 { + self._tab.get::<u32>(TypeAliases::VT_U32_, Some(0)).unwrap() + } + #[inline] + pub fn i64_(&self) -> i64 { + self._tab.get::<i64>(TypeAliases::VT_I64_, Some(0)).unwrap() + } + #[inline] + pub fn u64_(&self) -> u64 { + self._tab.get::<u64>(TypeAliases::VT_U64_, Some(0)).unwrap() + } + #[inline] + pub fn f32_(&self) -> f32 { + self._tab.get::<f32>(TypeAliases::VT_F32_, Some(0.0)).unwrap() + } + #[inline] + pub fn f64_(&self) -> f64 { + self._tab.get::<f64>(TypeAliases::VT_F64_, Some(0.0)).unwrap() + } + #[inline] + pub fn v8(&self) -> Option<&'a [i8]> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, i8>>>(TypeAliases::VT_V8, None).map(|v| v.safe_slice()) + } + #[inline] + pub fn vf64(&self) -> Option<flatbuffers::Vector<'a, f64>> { + self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, f64>>>(TypeAliases::VT_VF64, None) + } +} + +impl flatbuffers::Verifiable for TypeAliases<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::<i8>("i8_", Self::VT_I8_, false)? + .visit_field::<u8>("u8_", Self::VT_U8_, false)? + .visit_field::<i16>("i16_", Self::VT_I16_, false)? + .visit_field::<u16>("u16_", Self::VT_U16_, false)? + .visit_field::<i32>("i32_", Self::VT_I32_, false)? + .visit_field::<u32>("u32_", Self::VT_U32_, false)? + .visit_field::<i64>("i64_", Self::VT_I64_, false)? + .visit_field::<u64>("u64_", Self::VT_U64_, false)? + .visit_field::<f32>("f32_", Self::VT_F32_, false)? + .visit_field::<f64>("f64_", Self::VT_F64_, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, i8>>>("v8", Self::VT_V8, false)? + .visit_field::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'_, f64>>>("vf64", Self::VT_VF64, false)? + .finish(); + Ok(()) + } +} +pub struct TypeAliasesArgs<'a> { + pub i8_: i8, + pub u8_: u8, + pub i16_: i16, + pub u16_: u16, + pub i32_: i32, + pub u32_: u32, + pub i64_: i64, + pub u64_: u64, + pub f32_: f32, + pub f64_: f64, + pub v8: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, i8>>>, + pub vf64: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, f64>>>, +} +impl<'a> Default for TypeAliasesArgs<'a> { + #[inline] + fn default() -> Self { + TypeAliasesArgs { + i8_: 0, + u8_: 0, + i16_: 0, + u16_: 0, + i32_: 0, + u32_: 0, + i64_: 0, + u64_: 0, + f32_: 0.0, + f64_: 0.0, + v8: None, + vf64: None, + } + } +} + +impl Serialize for TypeAliases<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("TypeAliases", 12)?; + s.serialize_field("i8_", &self.i8_())?; + s.serialize_field("u8_", &self.u8_())?; + s.serialize_field("i16_", &self.i16_())?; + s.serialize_field("u16_", &self.u16_())?; + s.serialize_field("i32_", &self.i32_())?; + s.serialize_field("u32_", &self.u32_())?; + s.serialize_field("i64_", &self.i64_())?; + s.serialize_field("u64_", &self.u64_())?; + s.serialize_field("f32_", &self.f32_())?; + s.serialize_field("f64_", &self.f64_())?; + if let Some(f) = self.v8() { + s.serialize_field("v8", &f)?; + } else { + s.skip_field("v8")?; + } + if let Some(f) = self.vf64() { + s.serialize_field("vf64", &f)?; + } else { + s.skip_field("vf64")?; + } + s.end() + } +} + +pub struct TypeAliasesBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> TypeAliasesBuilder<'a, 'b> { + #[inline] + pub fn add_i8_(&mut self, i8_: i8) { + self.fbb_.push_slot::<i8>(TypeAliases::VT_I8_, i8_, 0); + } + #[inline] + pub fn add_u8_(&mut self, u8_: u8) { + self.fbb_.push_slot::<u8>(TypeAliases::VT_U8_, u8_, 0); + } + #[inline] + pub fn add_i16_(&mut self, i16_: i16) { + self.fbb_.push_slot::<i16>(TypeAliases::VT_I16_, i16_, 0); + } + #[inline] + pub fn add_u16_(&mut self, u16_: u16) { + self.fbb_.push_slot::<u16>(TypeAliases::VT_U16_, u16_, 0); + } + #[inline] + pub fn add_i32_(&mut self, i32_: i32) { + self.fbb_.push_slot::<i32>(TypeAliases::VT_I32_, i32_, 0); + } + #[inline] + pub fn add_u32_(&mut self, u32_: u32) { + self.fbb_.push_slot::<u32>(TypeAliases::VT_U32_, u32_, 0); + } + #[inline] + pub fn add_i64_(&mut self, i64_: i64) { + self.fbb_.push_slot::<i64>(TypeAliases::VT_I64_, i64_, 0); + } + #[inline] + pub fn add_u64_(&mut self, u64_: u64) { + self.fbb_.push_slot::<u64>(TypeAliases::VT_U64_, u64_, 0); + } + #[inline] + pub fn add_f32_(&mut self, f32_: f32) { + self.fbb_.push_slot::<f32>(TypeAliases::VT_F32_, f32_, 0.0); + } + #[inline] + pub fn add_f64_(&mut self, f64_: f64) { + self.fbb_.push_slot::<f64>(TypeAliases::VT_F64_, f64_, 0.0); + } + #[inline] + pub fn add_v8(&mut self, v8: flatbuffers::WIPOffset<flatbuffers::Vector<'b , i8>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(TypeAliases::VT_V8, v8); + } + #[inline] + pub fn add_vf64(&mut self, vf64: flatbuffers::WIPOffset<flatbuffers::Vector<'b , f64>>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(TypeAliases::VT_VF64, vf64); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> TypeAliasesBuilder<'a, 'b> { + let start = _fbb.start_table(); + TypeAliasesBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<TypeAliases<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for TypeAliases<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("TypeAliases"); + ds.field("i8_", &self.i8_()); + ds.field("u8_", &self.u8_()); + ds.field("i16_", &self.i16_()); + ds.field("u16_", &self.u16_()); + ds.field("i32_", &self.i32_()); + ds.field("u32_", &self.u32_()); + ds.field("i64_", &self.i64_()); + ds.field("u64_", &self.u64_()); + ds.field("f32_", &self.f32_()); + ds.field("f64_", &self.f64_()); + ds.field("v8", &self.v8()); + ds.field("vf64", &self.vf64()); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct TypeAliasesT { + pub i8_: i8, + pub u8_: u8, + pub i16_: i16, + pub u16_: u16, + pub i32_: i32, + pub u32_: u32, + pub i64_: i64, + pub u64_: u64, + pub f32_: f32, + pub f64_: f64, + pub v8: Option<Vec<i8>>, + pub vf64: Option<Vec<f64>>, +} +impl Default for TypeAliasesT { + fn default() -> Self { + Self { + i8_: 0, + u8_: 0, + i16_: 0, + u16_: 0, + i32_: 0, + u32_: 0, + i64_: 0, + u64_: 0, + f32_: 0.0, + f64_: 0.0, + v8: None, + vf64: None, + } + } +} +impl TypeAliasesT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<TypeAliases<'b>> { + let i8_ = self.i8_; + let u8_ = self.u8_; + let i16_ = self.i16_; + let u16_ = self.u16_; + let i32_ = self.i32_; + let u32_ = self.u32_; + let i64_ = self.i64_; + let u64_ = self.u64_; + let f32_ = self.f32_; + let f64_ = self.f64_; + let v8 = self.v8.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + let vf64 = self.vf64.as_ref().map(|x|{ + _fbb.create_vector(x) + }); + TypeAliases::create(_fbb, &TypeAliasesArgs{ + i8_, + u8_, + i16_, + u16_, + i32_, + u32_, + i64_, + u64_, + f32_, + f64_, + v8, + vf64, + }) + } +} diff --git a/tests/monster_test_serialize/my_game/example/vec_3_generated.rs b/tests/monster_test_serialize/my_game/example/vec_3_generated.rs new file mode 100644 index 00000000..f04d0e8f --- /dev/null +++ b/tests/monster_test_serialize/my_game/example/vec_3_generated.rs @@ -0,0 +1,276 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +// struct Vec3, aligned to 8 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct Vec3(pub [u8; 32]); +impl Default for Vec3 { + fn default() -> Self { + Self([0; 32]) + } +} +impl std::fmt::Debug for Vec3 { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct("Vec3") + .field("x", &self.x()) + .field("y", &self.y()) + .field("z", &self.z()) + .field("test1", &self.test1()) + .field("test2", &self.test2()) + .field("test3", &self.test3()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Vec3 {} +impl flatbuffers::SafeSliceAccess for Vec3 {} +impl<'a> flatbuffers::Follow<'a> for Vec3 { + type Inner = &'a Vec3; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a Vec3>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a Vec3 { + type Inner = &'a Vec3; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::<Vec3>(buf, loc) + } +} +impl<'b> flatbuffers::Push for Vec3 { + type Output = Vec3; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(self as *const Vec3 as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} +impl<'b> flatbuffers::Push for &'b Vec3 { + type Output = Vec3; + + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(*self as *const Vec3 as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} + +impl<'a> flatbuffers::Verifiable for Vec3 { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::<Self>(pos) + } +} + +impl Serialize for Vec3 { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("Vec3", 6)?; + s.serialize_field("x", &self.x())?; + s.serialize_field("y", &self.y())?; + s.serialize_field("z", &self.z())?; + s.serialize_field("test1", &self.test1())?; + s.serialize_field("test2", &self.test2())?; + s.serialize_field("test3", &self.test3())?; + s.end() + } +} + +impl<'a> Vec3 { + #[allow(clippy::too_many_arguments)] + pub fn new( + x: f32, + y: f32, + z: f32, + test1: f64, + test2: Color, + test3: &Test, + ) -> Self { + let mut s = Self([0; 32]); + s.set_x(x); + s.set_y(y); + s.set_z(z); + s.set_test1(test1); + s.set_test2(test2); + s.set_test3(test3); + s + } + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example.Vec3" + } + + pub fn x(&self) -> f32 { + let mut mem = core::mem::MaybeUninit::<f32>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<f32>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_x(&mut self, x: f32) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const f32 as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<f32>(), + ); + } + } + + pub fn y(&self) -> f32 { + let mut mem = core::mem::MaybeUninit::<f32>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<f32>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_y(&mut self, x: f32) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const f32 as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<f32>(), + ); + } + } + + pub fn z(&self) -> f32 { + let mut mem = core::mem::MaybeUninit::<f32>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[8..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<f32>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_z(&mut self, x: f32) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const f32 as *const u8, + self.0[8..].as_mut_ptr(), + core::mem::size_of::<f32>(), + ); + } + } + + pub fn test1(&self) -> f64 { + let mut mem = core::mem::MaybeUninit::<f64>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[16..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<f64>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_test1(&mut self, x: f64) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const f64 as *const u8, + self.0[16..].as_mut_ptr(), + core::mem::size_of::<f64>(), + ); + } + } + + pub fn test2(&self) -> Color { + let mut mem = core::mem::MaybeUninit::<Color>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[24..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<Color>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_test2(&mut self, x: Color) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const Color as *const u8, + self.0[24..].as_mut_ptr(), + core::mem::size_of::<Color>(), + ); + } + } + + pub fn test3(&self) -> &Test { + unsafe { &*(self.0[26..].as_ptr() as *const Test) } + } + + #[allow(clippy::identity_op)] + pub fn set_test3(&mut self, x: &Test) { + self.0[26..26 + 4].copy_from_slice(&x.0) + } + + pub fn unpack(&self) -> Vec3T { + Vec3T { + x: self.x(), + y: self.y(), + z: self.z(), + test1: self.test1(), + test2: self.test2(), + test3: self.test3().unpack(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Vec3T { + pub x: f32, + pub y: f32, + pub z: f32, + pub test1: f64, + pub test2: Color, + pub test3: TestT, +} +impl Vec3T { + pub fn pack(&self) -> Vec3 { + Vec3::new( + self.x, + self.y, + self.z, + self.test1, + self.test2, + &self.test3.pack(), + ) + } +} + diff --git a/tests/monster_test_serialize/my_game/example_2/monster_generated.rs b/tests/monster_test_serialize/my_game/example_2/monster_generated.rs new file mode 100644 index 00000000..7687c5e9 --- /dev/null +++ b/tests/monster_test_serialize/my_game/example_2/monster_generated.rs @@ -0,0 +1,124 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum MonsterOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct Monster<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for Monster<'a> { + type Inner = Monster<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> Monster<'a> { + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.Example2.Monster" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + Monster { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + _args: &'args MonsterArgs + ) -> flatbuffers::WIPOffset<Monster<'bldr>> { + let mut builder = MonsterBuilder::new(_fbb); + builder.finish() + } + + pub fn unpack(&self) -> MonsterT { + MonsterT { + } + } +} + +impl flatbuffers::Verifiable for Monster<'_> { + #[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 MonsterArgs { +} +impl<'a> Default for MonsterArgs { + #[inline] + fn default() -> Self { + MonsterArgs { + } + } +} + +impl Serialize for Monster<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let s = serializer.serialize_struct("Monster", 0)?; + s.end() + } +} + +pub struct MonsterBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> MonsterBuilder<'a, 'b> { + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> MonsterBuilder<'a, 'b> { + let start = _fbb.start_table(); + MonsterBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<Monster<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for Monster<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("Monster"); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct MonsterT { +} +impl Default for MonsterT { + fn default() -> Self { + Self { + } + } +} +impl MonsterT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<Monster<'b>> { + Monster::create(_fbb, &MonsterArgs{ + }) + } +} diff --git a/tests/monster_test_serialize/my_game/in_parent_namespace_generated.rs b/tests/monster_test_serialize/my_game/in_parent_namespace_generated.rs new file mode 100644 index 00000000..b2b0a095 --- /dev/null +++ b/tests/monster_test_serialize/my_game/in_parent_namespace_generated.rs @@ -0,0 +1,124 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum InParentNamespaceOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct InParentNamespace<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for InParentNamespace<'a> { + type Inner = InParentNamespace<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> InParentNamespace<'a> { + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.InParentNamespace" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + InParentNamespace { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + _args: &'args InParentNamespaceArgs + ) -> flatbuffers::WIPOffset<InParentNamespace<'bldr>> { + let mut builder = InParentNamespaceBuilder::new(_fbb); + builder.finish() + } + + pub fn unpack(&self) -> InParentNamespaceT { + InParentNamespaceT { + } + } +} + +impl flatbuffers::Verifiable for InParentNamespace<'_> { + #[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 InParentNamespaceArgs { +} +impl<'a> Default for InParentNamespaceArgs { + #[inline] + fn default() -> Self { + InParentNamespaceArgs { + } + } +} + +impl Serialize for InParentNamespace<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let s = serializer.serialize_struct("InParentNamespace", 0)?; + s.end() + } +} + +pub struct InParentNamespaceBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> InParentNamespaceBuilder<'a, 'b> { + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> InParentNamespaceBuilder<'a, 'b> { + let start = _fbb.start_table(); + InParentNamespaceBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<InParentNamespace<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for InParentNamespace<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("InParentNamespace"); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct InParentNamespaceT { +} +impl Default for InParentNamespaceT { + fn default() -> Self { + Self { + } + } +} +impl InParentNamespaceT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<InParentNamespace<'b>> { + InParentNamespace::create(_fbb, &InParentNamespaceArgs{ + }) + } +} diff --git a/tests/monster_test_serialize/my_game/other_name_space/from_include_generated.rs b/tests/monster_test_serialize/my_game/other_name_space/from_include_generated.rs new file mode 100644 index 00000000..06a0fa86 --- /dev/null +++ b/tests/monster_test_serialize/my_game/other_name_space/from_include_generated.rs @@ -0,0 +1,100 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +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_FROM_INCLUDE: i64 = 0; +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +pub const ENUM_MAX_FROM_INCLUDE: i64 = 0; +#[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_FROM_INCLUDE: [FromInclude; 1] = [ + FromInclude::IncludeVal, +]; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +#[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 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 Serialize for FromInclude { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_unit_variant("FromInclude", self.0 as u32, self.variant_name().unwrap()) + } +} + +impl<'a> flatbuffers::Follow<'a> for FromInclude { + type Inner = Self; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + let b = unsafe { + flatbuffers::read_scalar_at::<i64>(buf, loc) + }; + Self(b) + } +} + +impl flatbuffers::Push for FromInclude { + type Output = FromInclude; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + unsafe { flatbuffers::emplace_scalar::<i64>(dst, self.0); } + } +} + +impl flatbuffers::EndianScalar for FromInclude { + #[inline] + fn to_little_endian(self) -> Self { + let b = i64::to_le(self.0); + Self(b) + } + #[inline] + #[allow(clippy::wrong_self_convention)] + fn from_little_endian(self) -> Self { + let b = i64::from_le(self.0); + Self(b) + } +} + +impl<'a> flatbuffers::Verifiable for FromInclude { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + i64::run_verifier(v, pos) + } +} + +impl flatbuffers::SimpleToVerifyInSlice for FromInclude {} diff --git a/tests/monster_test_serialize/my_game/other_name_space/table_b_generated.rs b/tests/monster_test_serialize/my_game/other_name_space/table_b_generated.rs new file mode 100644 index 00000000..f09e1758 --- /dev/null +++ b/tests/monster_test_serialize/my_game/other_name_space/table_b_generated.rs @@ -0,0 +1,154 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum TableBOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct TableB<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for TableB<'a> { + type Inner = TableB<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> TableB<'a> { + pub const VT_A: flatbuffers::VOffsetT = 4; + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.OtherNameSpace.TableB" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + TableB { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + args: &'args TableBArgs<'args> + ) -> flatbuffers::WIPOffset<TableB<'bldr>> { + let mut builder = TableBBuilder::new(_fbb); + if let Some(x) = args.a { builder.add_a(x); } + builder.finish() + } + + pub fn unpack(&self) -> TableBT { + let a = self.a().map(|x| { + Box::new(x.unpack()) + }); + TableBT { + a, + } + } + + #[inline] + pub fn a(&self) -> Option<super::super::TableA<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None) + } +} + +impl flatbuffers::Verifiable for TableB<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::<flatbuffers::ForwardsUOffset<super::super::TableA>>("a", Self::VT_A, false)? + .finish(); + Ok(()) + } +} +pub struct TableBArgs<'a> { + pub a: Option<flatbuffers::WIPOffset<super::super::TableA<'a>>>, +} +impl<'a> Default for TableBArgs<'a> { + #[inline] + fn default() -> Self { + TableBArgs { + a: None, + } + } +} + +impl Serialize for TableB<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("TableB", 1)?; + if let Some(f) = self.a() { + s.serialize_field("a", &f)?; + } else { + s.skip_field("a")?; + } + s.end() + } +} + +pub struct TableBBuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> TableBBuilder<'a, 'b> { + #[inline] + pub fn add_a(&mut self, a: flatbuffers::WIPOffset<super::super::TableA<'b >>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> TableBBuilder<'a, 'b> { + let start = _fbb.start_table(); + TableBBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<TableB<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for TableB<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("TableB"); + ds.field("a", &self.a()); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct TableBT { + pub a: Option<Box<super::super::TableAT>>, +} +impl Default for TableBT { + fn default() -> Self { + Self { + a: None, + } + } +} +impl TableBT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<TableB<'b>> { + let a = self.a.as_ref().map(|x|{ + x.pack(_fbb) + }); + TableB::create(_fbb, &TableBArgs{ + a, + }) + } +} diff --git a/tests/monster_test_serialize/my_game/other_name_space/unused_generated.rs b/tests/monster_test_serialize/my_game/other_name_space/unused_generated.rs new file mode 100644 index 00000000..7b91447d --- /dev/null +++ b/tests/monster_test_serialize/my_game/other_name_space/unused_generated.rs @@ -0,0 +1,140 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +// struct Unused, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct Unused(pub [u8; 4]); +impl Default for Unused { + fn default() -> Self { + Self([0; 4]) + } +} +impl std::fmt::Debug for Unused { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct("Unused") + .field("a", &self.a()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Unused {} +impl flatbuffers::SafeSliceAccess for Unused {} +impl<'a> flatbuffers::Follow<'a> for Unused { + type Inner = &'a Unused; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a Unused>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a Unused { + type Inner = &'a Unused; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::<Unused>(buf, loc) + } +} +impl<'b> flatbuffers::Push for Unused { + type Output = Unused; + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(self as *const Unused as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} +impl<'b> flatbuffers::Push for &'b Unused { + type Output = Unused; + + #[inline] + fn push(&self, dst: &mut [u8], _rest: &[u8]) { + let src = unsafe { + ::std::slice::from_raw_parts(*self as *const Unused as *const u8, Self::size()) + }; + dst.copy_from_slice(src); + } +} + +impl<'a> flatbuffers::Verifiable for Unused { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::<Self>(pos) + } +} + +impl Serialize for Unused { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("Unused", 1)?; + s.serialize_field("a", &self.a())?; + s.end() + } +} + +impl<'a> Unused { + #[allow(clippy::too_many_arguments)] + pub fn new( + a: i32, + ) -> Self { + let mut s = Self([0; 4]); + s.set_a(a); + s + } + + pub const fn get_fully_qualified_name() -> &'static str { + "MyGame.OtherNameSpace.Unused" + } + + pub fn a(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<i32>::uninit(); + unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<i32>(), + ); + mem.assume_init() + }.from_little_endian() + } + + pub fn set_a(&mut self, x: i32) { + let x_le = x.to_little_endian(); + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const i32 as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<i32>(), + ); + } + } + + pub fn unpack(&self) -> UnusedT { + UnusedT { + a: self.a(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Default)] +pub struct UnusedT { + pub a: i32, +} +impl UnusedT { + pub fn pack(&self) -> Unused { + Unused::new( + self.a, + ) + } +} + diff --git a/tests/monster_test_serialize/table_a_generated.rs b/tests/monster_test_serialize/table_a_generated.rs new file mode 100644 index 00000000..eb03f496 --- /dev/null +++ b/tests/monster_test_serialize/table_a_generated.rs @@ -0,0 +1,154 @@ +// automatically generated by the FlatBuffers compiler, do not modify +extern crate flatbuffers; +use std::mem; +use std::cmp::Ordering; +extern crate serde; +use self::serde::ser::{Serialize, Serializer, SerializeStruct}; +use self::flatbuffers::{EndianScalar, Follow}; +use super::*; +pub enum TableAOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct TableA<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for TableA<'a> { + type Inner = TableA<'a>; + #[inline] + fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table { buf, loc } } + } +} + +impl<'a> TableA<'a> { + pub const VT_B: flatbuffers::VOffsetT = 4; + + pub const fn get_fully_qualified_name() -> &'static str { + "TableA" + } + + #[inline] + pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + TableA { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>, + args: &'args TableAArgs<'args> + ) -> flatbuffers::WIPOffset<TableA<'bldr>> { + let mut builder = TableABuilder::new(_fbb); + if let Some(x) = args.b { builder.add_b(x); } + builder.finish() + } + + pub fn unpack(&self) -> TableAT { + let b = self.b().map(|x| { + Box::new(x.unpack()) + }); + TableAT { + b, + } + } + + #[inline] + pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> { + self._tab.get::<flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None) + } +} + +impl flatbuffers::Verifiable for TableA<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::<flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>("b", Self::VT_B, false)? + .finish(); + Ok(()) + } +} +pub struct TableAArgs<'a> { + pub b: Option<flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>, +} +impl<'a> Default for TableAArgs<'a> { + #[inline] + fn default() -> Self { + TableAArgs { + b: None, + } + } +} + +impl Serialize for TableA<'_> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let mut s = serializer.serialize_struct("TableA", 1)?; + if let Some(f) = self.b() { + s.serialize_field("b", &f)?; + } else { + s.skip_field("b")?; + } + s.end() + } +} + +pub struct TableABuilder<'a: 'b, 'b> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, + start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, +} +impl<'a: 'b, 'b> TableABuilder<'a, 'b> { + #[inline] + pub fn add_b(&mut self, b: flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) { + self.fbb_.push_slot_always::<flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> TableABuilder<'a, 'b> { + let start = _fbb.start_table(); + TableABuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset<TableA<'a>> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl std::fmt::Debug for TableA<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut ds = f.debug_struct("TableA"); + ds.field("b", &self.b()); + ds.finish() + } +} +#[non_exhaustive] +#[derive(Debug, Clone, PartialEq)] +pub struct TableAT { + pub b: Option<Box<my_game::other_name_space::TableBT>>, +} +impl Default for TableAT { + fn default() -> Self { + Self { + b: None, + } + } +} +impl TableAT { + pub fn pack<'b>( + &self, + _fbb: &mut flatbuffers::FlatBufferBuilder<'b> + ) -> flatbuffers::WIPOffset<TableA<'b>> { + let b = self.b.as_ref().map(|x|{ + x.pack(_fbb) + }); + TableA::create(_fbb, &TableAArgs{ + b, + }) + } +} diff --git a/tests/more_defaults/more_defaults_generated.rs b/tests/more_defaults/more_defaults_generated.rs index 87f6ba36..0a881055 100644 --- a/tests/more_defaults/more_defaults_generated.rs +++ b/tests/more_defaults/more_defaults_generated.rs @@ -149,6 +149,7 @@ impl<'a> Default for MoreDefaultsArgs<'a> { } } } + pub struct MoreDefaultsBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/namespace_test/namespace_a/namespace_b/struct_in_nested_ns_generated.rs b/tests/namespace_test/namespace_a/namespace_b/struct_in_nested_ns_generated.rs index 0fbd86e0..55fff40e 100644 --- a/tests/namespace_test/namespace_a/namespace_b/struct_in_nested_ns_generated.rs +++ b/tests/namespace_test/namespace_a/namespace_b/struct_in_nested_ns_generated.rs @@ -69,6 +69,7 @@ impl<'a> flatbuffers::Verifiable for StructInNestedNS { v.in_buffer::<Self>(pos) } } + impl<'a> StructInNestedNS { #[allow(clippy::too_many_arguments)] pub fn new( diff --git a/tests/namespace_test/namespace_a/namespace_b/table_in_nested_ns_generated.rs b/tests/namespace_test/namespace_a/namespace_b/table_in_nested_ns_generated.rs index 575a8556..10d5b7cb 100644 --- a/tests/namespace_test/namespace_a/namespace_b/table_in_nested_ns_generated.rs +++ b/tests/namespace_test/namespace_a/namespace_b/table_in_nested_ns_generated.rs @@ -76,6 +76,7 @@ impl<'a> Default for TableInNestedNSArgs { } } } + pub struct TableInNestedNSBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/namespace_test/namespace_a/second_table_in_a_generated.rs b/tests/namespace_test/namespace_a/second_table_in_a_generated.rs index 385e8dd7..d63438b6 100644 --- a/tests/namespace_test/namespace_a/second_table_in_a_generated.rs +++ b/tests/namespace_test/namespace_a/second_table_in_a_generated.rs @@ -78,6 +78,7 @@ impl<'a> Default for SecondTableInAArgs<'a> { } } } + pub struct SecondTableInABuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/namespace_test/namespace_a/table_in_first_ns_generated.rs b/tests/namespace_test/namespace_a/table_in_first_ns_generated.rs index 018e526a..0a16074a 100644 --- a/tests/namespace_test/namespace_a/table_in_first_ns_generated.rs +++ b/tests/namespace_test/namespace_a/table_in_first_ns_generated.rs @@ -144,6 +144,7 @@ impl<'a> Default for TableInFirstNSArgs<'a> { } } } + pub struct TableInFirstNSBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/namespace_test/namespace_c/table_in_c_generated.rs b/tests/namespace_test/namespace_c/table_in_c_generated.rs index 5a1bdc9a..d4ac7837 100644 --- a/tests/namespace_test/namespace_c/table_in_c_generated.rs +++ b/tests/namespace_test/namespace_c/table_in_c_generated.rs @@ -91,6 +91,7 @@ impl<'a> Default for TableInCArgs<'a> { } } } + pub struct TableInCBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/optional_scalars/optional_scalars/scalar_stuff_generated.rs b/tests/optional_scalars/optional_scalars/scalar_stuff_generated.rs index 4b610f48..407e278f 100644 --- a/tests/optional_scalars/optional_scalars/scalar_stuff_generated.rs +++ b/tests/optional_scalars/optional_scalars/scalar_stuff_generated.rs @@ -461,6 +461,7 @@ impl<'a> Default for ScalarStuffArgs { } } } + pub struct ScalarStuffBuilder<'a: 'b, 'b> { fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>, start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>, diff --git a/tests/rust_serialize_test/Cargo.toml b/tests/rust_serialize_test/Cargo.toml new file mode 100644 index 00000000..ff47c123 --- /dev/null +++ b/tests/rust_serialize_test/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "rust_serialize_test" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +flatbuffers = { path = "../../rust/flatbuffers", features=["serialize"] } +serde = "1.0" +serde_json = "1.0" + diff --git a/tests/rust_serialize_test/src/main.rs b/tests/rust_serialize_test/src/main.rs new file mode 100644 index 00000000..d67cc208 --- /dev/null +++ b/tests/rust_serialize_test/src/main.rs @@ -0,0 +1,89 @@ +#[allow(dead_code, unused_imports)] +#[path = "../../monster_test_serialize/mod.rs"] +mod monster_test_serialize_generated; +pub use monster_test_serialize_generated::my_game; + +fn create_serialized_example_with_generated_code(builder: &mut flatbuffers::FlatBufferBuilder) { + let mon = { + let s0 = builder.create_string("test1"); + let s1 = builder.create_string("test2"); + let fred_name = builder.create_string("Fred"); + + // can't inline creation of this Vec3 because we refer to it by reference, so it must live + // long enough to be used by MonsterArgs. + let pos = my_game::example::Vec3::new( + 1.0, + 2.0, + 3.0, + 3.0, + my_game::example::Color::Green, + &my_game::example::Test::new(5i16, 6i8), + ); + + let args = my_game::example::MonsterArgs { + hp: 80, + mana: 150, + name: Some(builder.create_string("MyMonster")), + pos: Some(&pos), + test_type: my_game::example::Any::Monster, + test: Some( + my_game::example::Monster::create( + builder, + &my_game::example::MonsterArgs { + name: Some(fred_name), + ..Default::default() + }, + ) + .as_union_value(), + ), + inventory: Some(builder.create_vector_direct(&[0u8, 1, 2, 3, 4][..])), + test4: Some(builder.create_vector_direct(&[ + my_game::example::Test::new(10, 20), + my_game::example::Test::new(30, 40), + ])), + testarrayofstring: Some(builder.create_vector(&[s0, s1])), + ..Default::default() + }; + my_game::example::Monster::create(builder, &args) + }; + my_game::example::finish_monster_buffer(builder, mon); +} + +fn main() { + // This test is built into its own crate because it has a different set of + // dependencies as the normal Rust tests; it requires that the `flatbuffer` + // dependency have the "serialize" feature enabled. As this feature may + // cause extra code gen and dependencies for those who do not need it, it + // is disabled by default. + let mut builder = flatbuffers::FlatBufferBuilder::new(); + create_serialized_example_with_generated_code(&mut builder); + + let data = builder.finished_data(); + let obj = my_game::example::root_as_monster(&data[..]).unwrap(); + let value = serde_json::to_value(&obj).unwrap(); + let o = value.as_object().unwrap(); + + let pos = o.get("pos").unwrap().as_object().unwrap(); + assert_eq!(pos.get("x").unwrap().as_f64().unwrap(), 1.0); + assert_eq!(pos.get("y").unwrap().as_f64().unwrap(), 2.0); + assert_eq!(pos.get("z").unwrap().as_f64().unwrap(), 3.0); + + let mana = o.get("mana").unwrap(); + assert_eq!(mana.as_i64().unwrap(), 150); + + let hp = o.get("hp").unwrap(); + assert_eq!(hp.as_i64().unwrap(), 80); + + let name = o.get("name").unwrap(); + assert_eq!(name.as_str().unwrap(), "MyMonster"); + + let test_type = o.get("test_type").unwrap(); + assert_eq!(test_type.as_str().unwrap(), "Monster"); + + let testarrayofstring = o.get("testarrayofstring").unwrap().as_array().unwrap(); + let t0 = testarrayofstring[0].as_str().unwrap(); + assert_eq!(t0, "test1"); + + let t1 = testarrayofstring[1].as_str().unwrap(); + assert_eq!(t1, "test2"); +} diff --git a/tests/rust_usage_test/Cargo.toml b/tests/rust_usage_test/Cargo.toml index 47a83388..e676970e 100644 --- a/tests/rust_usage_test/Cargo.toml +++ b/tests/rust_usage_test/Cargo.toml @@ -44,6 +44,7 @@ path = "../../samples/sample_binary.rs" [dev-dependencies] quickcheck = "0.6" # TODO(rw): look into moving to criterion.rs +serde = "1.0" bencher = "0.1.5" static_assertions = "1.0.0" rand = "*" diff --git a/tests/rust_usage_test/outdir/Cargo.toml b/tests/rust_usage_test/outdir/Cargo.toml index 8387d170..659638f1 100644 --- a/tests/rust_usage_test/outdir/Cargo.toml +++ b/tests/rust_usage_test/outdir/Cargo.toml @@ -8,3 +8,4 @@ edition = "2018" [dependencies] flatbuffers = { path = "../../../rust/flatbuffers" } +serde = "1.0" |