mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-16 09:12:22 +00:00
Rust Flatbuffers Verifier (#6269)
* Updated comments and fixed a fundemental type error. * bump rust flatbuffers semver * Initial commit with verifier, need to clean up * Verifier tested. Needs clean up and refactoring. * Display for InvalidFlatbuffer and better errors for strings * SimpleToVerify, some refactoring * Combined VerifierType TableAccessorFuncBody into FollowType * scrub todos * Update Rust get_root functions. There are 6 variants, with verifier options, default verifier options and no verification "fast". * Rename root fns * inline * Update to use thiserror * fix for bad compiler * improve error formatting * Replace multiply with saturating_multiply * saturating adds too * Add docs disclaiming experimental verification system Co-authored-by: Casper Neo <cneo@google.com>
This commit is contained in:
@@ -45,10 +45,22 @@ impl<'a> TableA<'a> {
|
||||
|
||||
#[inline]
|
||||
pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB<'a>>>(TableA::VT_B, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB>>(TableA::VT_B, None)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for TableA<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, 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>>>,
|
||||
}
|
||||
|
||||
@@ -72,7 +72,8 @@ impl<'a> flatbuffers::Follow<'a> for FromInclude {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
Self(flatbuffers::read_scalar_at::<i64>(buf, loc))
|
||||
let b = flatbuffers::read_scalar_at::<i64>(buf, loc);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,14 +88,27 @@ impl flatbuffers::Push for FromInclude {
|
||||
impl flatbuffers::EndianScalar for FromInclude {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
Self(i64::to_le(self.0))
|
||||
let b = i64::to_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
Self(i64::from_le(self.0))
|
||||
let b = i64::from_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for FromInclude {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
i64::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for FromInclude {}
|
||||
// struct Unused, aligned to 4
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Clone, Copy, PartialEq)]
|
||||
@@ -109,6 +123,7 @@ impl std::fmt::Debug for Unused {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for Unused {}
|
||||
impl flatbuffers::SafeSliceAccess for Unused {}
|
||||
impl<'a> flatbuffers::Follow<'a> for Unused {
|
||||
type Inner = &'a Unused;
|
||||
@@ -146,7 +161,15 @@ impl<'b> flatbuffers::Push for &'b Unused {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for Unused {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.in_buffer::<Self>(pos)
|
||||
}
|
||||
}
|
||||
impl Unused {
|
||||
pub fn new(_a: i32) -> Self {
|
||||
Unused {
|
||||
@@ -194,10 +217,22 @@ impl<'a> TableB<'a> {
|
||||
|
||||
#[inline]
|
||||
pub fn a(&self) -> Option<super::super::TableA<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::super::TableA<'a>>>(TableB::VT_A, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::super::TableA>>(TableB::VT_A, None)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for TableB<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, 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>>>,
|
||||
}
|
||||
|
||||
@@ -58,6 +58,17 @@ impl<'a> InParentNamespace<'a> {
|
||||
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for InParentNamespace<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.visit_table(pos)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct InParentNamespaceArgs {
|
||||
}
|
||||
impl<'a> Default for InParentNamespaceArgs {
|
||||
@@ -140,6 +151,17 @@ impl<'a> Monster<'a> {
|
||||
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for Monster<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.visit_table(pos)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct MonsterArgs {
|
||||
}
|
||||
impl<'a> Default for MonsterArgs {
|
||||
@@ -208,8 +230,8 @@ impl<'a> flatbuffers::Follow<'a> for Color {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
let bits = flatbuffers::read_scalar_at::<u8>(buf, loc);
|
||||
unsafe { Self::from_bits_unchecked(bits) }
|
||||
let b = flatbuffers::read_scalar_at::<u8>(buf, loc);
|
||||
unsafe { Self::from_bits_unchecked(b) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,16 +246,27 @@ impl flatbuffers::Push for Color {
|
||||
impl flatbuffers::EndianScalar for Color {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
let bits = u8::to_le(self.bits());
|
||||
unsafe { Self::from_bits_unchecked(bits) }
|
||||
let b = u8::to_le(self.bits());
|
||||
unsafe { Self::from_bits_unchecked(b) }
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
let bits = u8::from_le(self.bits());
|
||||
unsafe { Self::from_bits_unchecked(bits) }
|
||||
let b = u8::from_le(self.bits());
|
||||
unsafe { Self::from_bits_unchecked(b) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for Color {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
u8::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for Color {}
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
pub const ENUM_MIN_RACE: i8 = -1;
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
@@ -289,7 +322,8 @@ impl<'a> flatbuffers::Follow<'a> for Race {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
Self(flatbuffers::read_scalar_at::<i8>(buf, loc))
|
||||
let b = flatbuffers::read_scalar_at::<i8>(buf, loc);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -304,14 +338,27 @@ impl flatbuffers::Push for Race {
|
||||
impl flatbuffers::EndianScalar for Race {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
Self(i8::to_le(self.0))
|
||||
let b = i8::to_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
Self(i8::from_le(self.0))
|
||||
let b = i8::from_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for Race {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
i8::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for Race {}
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
pub const ENUM_MIN_ANY: u8 = 0;
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
@@ -363,11 +410,13 @@ impl std::fmt::Debug for Any {
|
||||
}
|
||||
}
|
||||
}
|
||||
pub struct AnyUnionTableOffset {}
|
||||
impl<'a> flatbuffers::Follow<'a> for Any {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
Self(flatbuffers::read_scalar_at::<u8>(buf, loc))
|
||||
let b = flatbuffers::read_scalar_at::<u8>(buf, loc);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -382,15 +431,27 @@ impl flatbuffers::Push for Any {
|
||||
impl flatbuffers::EndianScalar for Any {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
Self(u8::to_le(self.0))
|
||||
let b = u8::to_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
Self(u8::from_le(self.0))
|
||||
let b = u8::from_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct AnyUnionTableOffset {}
|
||||
impl<'a> flatbuffers::Verifiable for Any {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
u8::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for Any {}
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
pub const ENUM_MIN_ANY_UNIQUE_ALIASES: u8 = 0;
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
@@ -442,11 +503,13 @@ impl std::fmt::Debug for AnyUniqueAliases {
|
||||
}
|
||||
}
|
||||
}
|
||||
pub struct AnyUniqueAliasesUnionTableOffset {}
|
||||
impl<'a> flatbuffers::Follow<'a> for AnyUniqueAliases {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
Self(flatbuffers::read_scalar_at::<u8>(buf, loc))
|
||||
let b = flatbuffers::read_scalar_at::<u8>(buf, loc);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -461,15 +524,27 @@ impl flatbuffers::Push for AnyUniqueAliases {
|
||||
impl flatbuffers::EndianScalar for AnyUniqueAliases {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
Self(u8::to_le(self.0))
|
||||
let b = u8::to_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
Self(u8::from_le(self.0))
|
||||
let b = u8::from_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct AnyUniqueAliasesUnionTableOffset {}
|
||||
impl<'a> flatbuffers::Verifiable for AnyUniqueAliases {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
u8::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for AnyUniqueAliases {}
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
pub const ENUM_MIN_ANY_AMBIGUOUS_ALIASES: u8 = 0;
|
||||
#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
|
||||
@@ -521,11 +596,13 @@ impl std::fmt::Debug for AnyAmbiguousAliases {
|
||||
}
|
||||
}
|
||||
}
|
||||
pub struct AnyAmbiguousAliasesUnionTableOffset {}
|
||||
impl<'a> flatbuffers::Follow<'a> for AnyAmbiguousAliases {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
Self(flatbuffers::read_scalar_at::<u8>(buf, loc))
|
||||
let b = flatbuffers::read_scalar_at::<u8>(buf, loc);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -540,15 +617,27 @@ impl flatbuffers::Push for AnyAmbiguousAliases {
|
||||
impl flatbuffers::EndianScalar for AnyAmbiguousAliases {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
Self(u8::to_le(self.0))
|
||||
let b = u8::to_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
Self(u8::from_le(self.0))
|
||||
let b = u8::from_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct AnyAmbiguousAliasesUnionTableOffset {}
|
||||
impl<'a> flatbuffers::Verifiable for AnyAmbiguousAliases {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
u8::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for AnyAmbiguousAliases {}
|
||||
// struct Test, aligned to 2
|
||||
#[repr(C, align(2))]
|
||||
#[derive(Clone, Copy, PartialEq)]
|
||||
@@ -566,6 +655,7 @@ impl std::fmt::Debug for Test {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for Test {}
|
||||
impl flatbuffers::SafeSliceAccess for Test {}
|
||||
impl<'a> flatbuffers::Follow<'a> for Test {
|
||||
type Inner = &'a Test;
|
||||
@@ -603,7 +693,15 @@ impl<'b> flatbuffers::Push for &'b Test {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for Test {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.in_buffer::<Self>(pos)
|
||||
}
|
||||
}
|
||||
impl Test {
|
||||
pub fn new(_a: i16, _b: i8) -> Self {
|
||||
Test {
|
||||
@@ -652,6 +750,7 @@ impl std::fmt::Debug for Vec3 {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for Vec3 {}
|
||||
impl flatbuffers::SafeSliceAccess for Vec3 {}
|
||||
impl<'a> flatbuffers::Follow<'a> for Vec3 {
|
||||
type Inner = &'a Vec3;
|
||||
@@ -689,7 +788,15 @@ impl<'b> flatbuffers::Push for &'b Vec3 {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for Vec3 {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.in_buffer::<Self>(pos)
|
||||
}
|
||||
}
|
||||
impl Vec3 {
|
||||
pub fn new(_x: f32, _y: f32, _z: f32, _test1: f64, _test2: Color, _test3: &Test) -> Self {
|
||||
Vec3 {
|
||||
@@ -745,6 +852,7 @@ impl std::fmt::Debug for Ability {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for Ability {}
|
||||
impl flatbuffers::SafeSliceAccess for Ability {}
|
||||
impl<'a> flatbuffers::Follow<'a> for Ability {
|
||||
type Inner = &'a Ability;
|
||||
@@ -782,7 +890,15 @@ impl<'b> flatbuffers::Push for &'b Ability {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for Ability {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.in_buffer::<Self>(pos)
|
||||
}
|
||||
}
|
||||
impl Ability {
|
||||
pub fn new(_id: u32, _distance: u32) -> Self {
|
||||
Ability {
|
||||
@@ -856,6 +972,18 @@ impl<'a> TestSimpleTableWithEnum<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for TestSimpleTableWithEnum<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, 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,
|
||||
}
|
||||
@@ -953,6 +1081,20 @@ impl<'a> Stat<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for Stat<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, 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,
|
||||
@@ -1062,6 +1204,18 @@ impl<'a> Referrable<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for Referrable<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, 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,
|
||||
}
|
||||
@@ -1282,21 +1436,21 @@ impl<'a> Monster<'a> {
|
||||
}
|
||||
#[inline]
|
||||
pub fn test4(&self) -> Option<&'a [Test]> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<Test>>>(Monster::VT_TEST4, None).map(|v| v.safe_slice() )
|
||||
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<flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING, None)
|
||||
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<flatbuffers::ForwardsUOffset<Monster<'a>>>>>(Monster::VT_TESTARRAYOFTABLES, None)
|
||||
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<'a>>>(Monster::VT_ENEMY, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<Monster>>(Monster::VT_ENEMY, None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn testnestedflatbuffer(&self) -> Option<&'a [u8]> {
|
||||
@@ -1310,7 +1464,7 @@ impl<'a> Monster<'a> {
|
||||
}
|
||||
#[inline]
|
||||
pub fn testempty(&self) -> Option<Stat<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<Stat<'a>>>(Monster::VT_TESTEMPTY, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<Stat>>(Monster::VT_TESTEMPTY, None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn testbool(&self) -> bool {
|
||||
@@ -1366,11 +1520,11 @@ impl<'a> Monster<'a> {
|
||||
}
|
||||
#[inline]
|
||||
pub fn testarrayofstring2(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<flatbuffers::ForwardsUOffset<&'a str>>>>(Monster::VT_TESTARRAYOFSTRING2, None)
|
||||
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<Ability>>>(Monster::VT_TESTARRAYOFSORTEDSTRUCT, None).map(|v| v.safe_slice() )
|
||||
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]> {
|
||||
@@ -1378,7 +1532,7 @@ impl<'a> Monster<'a> {
|
||||
}
|
||||
#[inline]
|
||||
pub fn test5(&self) -> Option<&'a [Test]> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<Test>>>(Monster::VT_TEST5, None).map(|v| v.safe_slice() )
|
||||
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>> {
|
||||
@@ -1390,11 +1544,11 @@ impl<'a> Monster<'a> {
|
||||
}
|
||||
#[inline]
|
||||
pub fn parent_namespace_test(&self) -> Option<super::InParentNamespace<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::InParentNamespace<'a>>>(Monster::VT_PARENT_NAMESPACE_TEST, None)
|
||||
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<flatbuffers::ForwardsUOffset<Referrable<'a>>>>>(Monster::VT_VECTOR_OF_REFERRABLES, None)
|
||||
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 {
|
||||
@@ -1406,7 +1560,7 @@ impl<'a> Monster<'a> {
|
||||
}
|
||||
#[inline]
|
||||
pub fn vector_of_strong_referrables(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable<'a>>>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<flatbuffers::ForwardsUOffset<Referrable<'a>>>>>(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, None)
|
||||
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 {
|
||||
@@ -1550,6 +1704,84 @@ impl<'a> Monster<'a> {
|
||||
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for Monster<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, 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)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct MonsterArgs<'a> {
|
||||
pub pos: Option<&'a Vec3>,
|
||||
pub mana: i16,
|
||||
@@ -2116,6 +2348,29 @@ impl<'a> TypeAliases<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for TypeAliases<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, 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,
|
||||
@@ -2236,15 +2491,77 @@ impl std::fmt::Debug for TypeAliases<'_> {
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
#[deprecated(since="1.13", note="Deprecated in favor of `root_as...` methods.")]
|
||||
pub fn get_root_as_monster<'a>(buf: &'a [u8]) -> Monster<'a> {
|
||||
flatbuffers::get_root::<Monster<'a>>(buf)
|
||||
unsafe { flatbuffers::root_unchecked::<Monster<'a>>(buf) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[deprecated(since="1.13", note="Deprecated in favor of `root_as...` methods.")]
|
||||
pub fn get_size_prefixed_root_as_monster<'a>(buf: &'a [u8]) -> Monster<'a> {
|
||||
flatbuffers::get_size_prefixed_root::<Monster<'a>>(buf)
|
||||
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]
|
||||
|
||||
@@ -77,7 +77,8 @@ impl<'a> flatbuffers::Follow<'a> for EnumInNestedNS {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
Self(flatbuffers::read_scalar_at::<i8>(buf, loc))
|
||||
let b = flatbuffers::read_scalar_at::<i8>(buf, loc);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,14 +93,27 @@ impl flatbuffers::Push for EnumInNestedNS {
|
||||
impl flatbuffers::EndianScalar for EnumInNestedNS {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
Self(i8::to_le(self.0))
|
||||
let b = i8::to_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
Self(i8::from_le(self.0))
|
||||
let b = i8::from_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for EnumInNestedNS {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
i8::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for EnumInNestedNS {}
|
||||
// struct StructInNestedNS, aligned to 4
|
||||
#[repr(C, align(4))]
|
||||
#[derive(Clone, Copy, PartialEq)]
|
||||
@@ -116,6 +130,7 @@ impl std::fmt::Debug for StructInNestedNS {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for StructInNestedNS {}
|
||||
impl flatbuffers::SafeSliceAccess for StructInNestedNS {}
|
||||
impl<'a> flatbuffers::Follow<'a> for StructInNestedNS {
|
||||
type Inner = &'a StructInNestedNS;
|
||||
@@ -153,7 +168,15 @@ impl<'b> flatbuffers::Push for &'b StructInNestedNS {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for StructInNestedNS {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.in_buffer::<Self>(pos)
|
||||
}
|
||||
}
|
||||
impl StructInNestedNS {
|
||||
pub fn new(_a: i32, _b: i32) -> Self {
|
||||
StructInNestedNS {
|
||||
@@ -217,6 +240,18 @@ impl<'a> TableInNestedNS<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for TableInNestedNS<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.visit_table(pos)?
|
||||
.visit_field::<i32>(&"foo", Self::VT_FOO, false)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct TableInNestedNSArgs {
|
||||
pub foo: i32,
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ impl<'a> TableInFirstNS<'a> {
|
||||
|
||||
#[inline]
|
||||
pub fn foo_table(&self) -> Option<namespace_b::TableInNestedNS<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<namespace_b::TableInNestedNS<'a>>>(TableInFirstNS::VT_FOO_TABLE, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<namespace_b::TableInNestedNS>>(TableInFirstNS::VT_FOO_TABLE, None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn foo_enum(&self) -> namespace_b::EnumInNestedNS {
|
||||
@@ -75,6 +75,20 @@ impl<'a> TableInFirstNS<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for TableInFirstNS<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.visit_table(pos)?
|
||||
.visit_field::<flatbuffers::ForwardsUOffset<namespace_b::TableInNestedNS>>(&"foo_table", Self::VT_FOO_TABLE, false)?
|
||||
.visit_field::<namespace_b::EnumInNestedNS>(&"foo_enum", Self::VT_FOO_ENUM, false)?
|
||||
.visit_field::<namespace_b::StructInNestedNS>(&"foo_struct", Self::VT_FOO_STRUCT, false)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct TableInFirstNSArgs<'a> {
|
||||
pub foo_table: Option<flatbuffers::WIPOffset<namespace_b::TableInNestedNS<'a>>>,
|
||||
pub foo_enum: namespace_b::EnumInNestedNS,
|
||||
@@ -170,10 +184,22 @@ impl<'a> SecondTableInA<'a> {
|
||||
|
||||
#[inline]
|
||||
pub fn refer_to_c(&self) -> Option<super::namespace_c::TableInC<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::namespace_c::TableInC<'a>>>(SecondTableInA::VT_REFER_TO_C, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::namespace_c::TableInC>>(SecondTableInA::VT_REFER_TO_C, None)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for SecondTableInA<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.visit_table(pos)?
|
||||
.visit_field::<flatbuffers::ForwardsUOffset<super::namespace_c::TableInC>>(&"refer_to_c", Self::VT_REFER_TO_C, false)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct SecondTableInAArgs<'a> {
|
||||
pub refer_to_c: Option<flatbuffers::WIPOffset<super::namespace_c::TableInC<'a>>>,
|
||||
}
|
||||
@@ -269,14 +295,27 @@ impl<'a> TableInC<'a> {
|
||||
|
||||
#[inline]
|
||||
pub fn refer_to_a1(&self) -> Option<super::namespace_a::TableInFirstNS<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::namespace_a::TableInFirstNS<'a>>>(TableInC::VT_REFER_TO_A1, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::namespace_a::TableInFirstNS>>(TableInC::VT_REFER_TO_A1, None)
|
||||
}
|
||||
#[inline]
|
||||
pub fn refer_to_a2(&self) -> Option<super::namespace_a::SecondTableInA<'a>> {
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::namespace_a::SecondTableInA<'a>>>(TableInC::VT_REFER_TO_A2, None)
|
||||
self._tab.get::<flatbuffers::ForwardsUOffset<super::namespace_a::SecondTableInA>>(TableInC::VT_REFER_TO_A2, None)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for TableInC<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.visit_table(pos)?
|
||||
.visit_field::<flatbuffers::ForwardsUOffset<super::namespace_a::TableInFirstNS>>(&"refer_to_a1", Self::VT_REFER_TO_A1, false)?
|
||||
.visit_field::<flatbuffers::ForwardsUOffset<super::namespace_a::SecondTableInA>>(&"refer_to_a2", Self::VT_REFER_TO_A2, false)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct TableInCArgs<'a> {
|
||||
pub refer_to_a1: Option<flatbuffers::WIPOffset<super::namespace_a::TableInFirstNS<'a>>>,
|
||||
pub refer_to_a2: Option<flatbuffers::WIPOffset<super::namespace_a::SecondTableInA<'a>>>,
|
||||
|
||||
@@ -69,7 +69,8 @@ impl<'a> flatbuffers::Follow<'a> for OptionalByte {
|
||||
type Inner = Self;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
Self(flatbuffers::read_scalar_at::<i8>(buf, loc))
|
||||
let b = flatbuffers::read_scalar_at::<i8>(buf, loc);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,14 +85,27 @@ impl flatbuffers::Push for OptionalByte {
|
||||
impl flatbuffers::EndianScalar for OptionalByte {
|
||||
#[inline]
|
||||
fn to_little_endian(self) -> Self {
|
||||
Self(i8::to_le(self.0))
|
||||
let b = i8::to_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
#[inline]
|
||||
fn from_little_endian(self) -> Self {
|
||||
Self(i8::from_le(self.0))
|
||||
let b = i8::from_le(self.0);
|
||||
Self(b)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> flatbuffers::Verifiable for OptionalByte {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
i8::run_verifier(v, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::SimpleToVerifyInSlice for OptionalByte {}
|
||||
pub enum ScalarStuffOffset {}
|
||||
#[derive(Copy, Clone, PartialEq)]
|
||||
|
||||
@@ -341,6 +355,53 @@ impl<'a> ScalarStuff<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl flatbuffers::Verifiable for ScalarStuff<'_> {
|
||||
#[inline]
|
||||
fn run_verifier<'o, 'b>(
|
||||
v: &mut flatbuffers::Verifier<'o, 'b>, pos: usize
|
||||
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
|
||||
use self::flatbuffers::Verifiable;
|
||||
v.visit_table(pos)?
|
||||
.visit_field::<i8>(&"just_i8", Self::VT_JUST_I8, false)?
|
||||
.visit_field::<i8>(&"maybe_i8", Self::VT_MAYBE_I8, false)?
|
||||
.visit_field::<i8>(&"default_i8", Self::VT_DEFAULT_I8, false)?
|
||||
.visit_field::<u8>(&"just_u8", Self::VT_JUST_U8, false)?
|
||||
.visit_field::<u8>(&"maybe_u8", Self::VT_MAYBE_U8, false)?
|
||||
.visit_field::<u8>(&"default_u8", Self::VT_DEFAULT_U8, false)?
|
||||
.visit_field::<i16>(&"just_i16", Self::VT_JUST_I16, false)?
|
||||
.visit_field::<i16>(&"maybe_i16", Self::VT_MAYBE_I16, false)?
|
||||
.visit_field::<i16>(&"default_i16", Self::VT_DEFAULT_I16, false)?
|
||||
.visit_field::<u16>(&"just_u16", Self::VT_JUST_U16, false)?
|
||||
.visit_field::<u16>(&"maybe_u16", Self::VT_MAYBE_U16, false)?
|
||||
.visit_field::<u16>(&"default_u16", Self::VT_DEFAULT_U16, false)?
|
||||
.visit_field::<i32>(&"just_i32", Self::VT_JUST_I32, false)?
|
||||
.visit_field::<i32>(&"maybe_i32", Self::VT_MAYBE_I32, false)?
|
||||
.visit_field::<i32>(&"default_i32", Self::VT_DEFAULT_I32, false)?
|
||||
.visit_field::<u32>(&"just_u32", Self::VT_JUST_U32, false)?
|
||||
.visit_field::<u32>(&"maybe_u32", Self::VT_MAYBE_U32, false)?
|
||||
.visit_field::<u32>(&"default_u32", Self::VT_DEFAULT_U32, false)?
|
||||
.visit_field::<i64>(&"just_i64", Self::VT_JUST_I64, false)?
|
||||
.visit_field::<i64>(&"maybe_i64", Self::VT_MAYBE_I64, false)?
|
||||
.visit_field::<i64>(&"default_i64", Self::VT_DEFAULT_I64, false)?
|
||||
.visit_field::<u64>(&"just_u64", Self::VT_JUST_U64, false)?
|
||||
.visit_field::<u64>(&"maybe_u64", Self::VT_MAYBE_U64, false)?
|
||||
.visit_field::<u64>(&"default_u64", Self::VT_DEFAULT_U64, false)?
|
||||
.visit_field::<f32>(&"just_f32", Self::VT_JUST_F32, false)?
|
||||
.visit_field::<f32>(&"maybe_f32", Self::VT_MAYBE_F32, false)?
|
||||
.visit_field::<f32>(&"default_f32", Self::VT_DEFAULT_F32, false)?
|
||||
.visit_field::<f64>(&"just_f64", Self::VT_JUST_F64, false)?
|
||||
.visit_field::<f64>(&"maybe_f64", Self::VT_MAYBE_F64, false)?
|
||||
.visit_field::<f64>(&"default_f64", Self::VT_DEFAULT_F64, false)?
|
||||
.visit_field::<bool>(&"just_bool", Self::VT_JUST_BOOL, false)?
|
||||
.visit_field::<bool>(&"maybe_bool", Self::VT_MAYBE_BOOL, false)?
|
||||
.visit_field::<bool>(&"default_bool", Self::VT_DEFAULT_BOOL, false)?
|
||||
.visit_field::<OptionalByte>(&"just_enum", Self::VT_JUST_ENUM, false)?
|
||||
.visit_field::<OptionalByte>(&"maybe_enum", Self::VT_MAYBE_ENUM, false)?
|
||||
.visit_field::<OptionalByte>(&"default_enum", Self::VT_DEFAULT_ENUM, false)?
|
||||
.finish();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
pub struct ScalarStuffArgs {
|
||||
pub just_i8: i8,
|
||||
pub maybe_i8: Option<i8>,
|
||||
@@ -629,15 +690,77 @@ impl std::fmt::Debug for ScalarStuff<'_> {
|
||||
}
|
||||
}
|
||||
#[inline]
|
||||
#[deprecated(since="1.13", note="Deprecated in favor of `root_as...` methods.")]
|
||||
pub fn get_root_as_scalar_stuff<'a>(buf: &'a [u8]) -> ScalarStuff<'a> {
|
||||
flatbuffers::get_root::<ScalarStuff<'a>>(buf)
|
||||
unsafe { flatbuffers::root_unchecked::<ScalarStuff<'a>>(buf) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[deprecated(since="1.13", note="Deprecated in favor of `root_as...` methods.")]
|
||||
pub fn get_size_prefixed_root_as_scalar_stuff<'a>(buf: &'a [u8]) -> ScalarStuff<'a> {
|
||||
flatbuffers::get_size_prefixed_root::<ScalarStuff<'a>>(buf)
|
||||
unsafe { flatbuffers::size_prefixed_root_unchecked::<ScalarStuff<'a>>(buf) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Verifies that a buffer of bytes contains a `ScalarStuff`
|
||||
/// 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_scalar_stuff_unchecked`.
|
||||
pub fn root_as_scalar_stuff(buf: &[u8]) -> Result<ScalarStuff, flatbuffers::InvalidFlatbuffer> {
|
||||
flatbuffers::root::<ScalarStuff>(buf)
|
||||
}
|
||||
#[inline]
|
||||
/// Verifies that a buffer of bytes contains a size prefixed
|
||||
/// `ScalarStuff` 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_scalar_stuff_unchecked`.
|
||||
pub fn size_prefixed_root_as_scalar_stuff(buf: &[u8]) -> Result<ScalarStuff, flatbuffers::InvalidFlatbuffer> {
|
||||
flatbuffers::size_prefixed_root::<ScalarStuff>(buf)
|
||||
}
|
||||
#[inline]
|
||||
/// Verifies, with the given options, that a buffer of bytes
|
||||
/// contains a `ScalarStuff` 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_scalar_stuff_unchecked`.
|
||||
pub fn root_as_scalar_stuff_with_opts<'b, 'o>(
|
||||
opts: &'o flatbuffers::VerifierOptions,
|
||||
buf: &'b [u8],
|
||||
) -> Result<ScalarStuff<'b>, flatbuffers::InvalidFlatbuffer> {
|
||||
flatbuffers::root_with_opts::<ScalarStuff<'b>>(opts, buf)
|
||||
}
|
||||
#[inline]
|
||||
/// Verifies, with the given verifier options, that a buffer of
|
||||
/// bytes contains a size prefixed `ScalarStuff` 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_scalar_stuff_unchecked`.
|
||||
pub fn size_prefixed_root_as_scalar_stuff_with_opts<'b, 'o>(
|
||||
opts: &'o flatbuffers::VerifierOptions,
|
||||
buf: &'b [u8],
|
||||
) -> Result<ScalarStuff<'b>, flatbuffers::InvalidFlatbuffer> {
|
||||
flatbuffers::size_prefixed_root_with_opts::<ScalarStuff<'b>>(opts, buf)
|
||||
}
|
||||
#[inline]
|
||||
/// Assumes, without verification, that a buffer of bytes contains a ScalarStuff and returns it.
|
||||
/// # Safety
|
||||
/// Callers must trust the given bytes do indeed contain a valid `ScalarStuff`.
|
||||
pub unsafe fn root_as_scalar_stuff_unchecked(buf: &[u8]) -> ScalarStuff {
|
||||
flatbuffers::root_unchecked::<ScalarStuff>(buf)
|
||||
}
|
||||
#[inline]
|
||||
/// Assumes, without verification, that a buffer of bytes contains a size prefixed ScalarStuff and returns it.
|
||||
/// # Safety
|
||||
/// Callers must trust the given bytes do indeed contain a valid size prefixed `ScalarStuff`.
|
||||
pub unsafe fn size_prefixed_root_as_scalar_stuff_unchecked(buf: &[u8]) -> ScalarStuff {
|
||||
flatbuffers::size_prefixed_root_unchecked::<ScalarStuff>(buf)
|
||||
}
|
||||
pub const SCALAR_STUFF_IDENTIFIER: &str = "NULL";
|
||||
|
||||
#[inline]
|
||||
|
||||
@@ -131,7 +131,7 @@ fn main() {
|
||||
|
||||
// do many reads, forcing them to execute by using assert_eq:
|
||||
{
|
||||
let m = my_game::example::get_root_as_monster(buf);
|
||||
let m = unsafe { my_game::example::root_as_monster_unchecked(buf) };
|
||||
assert_eq!(80, m.hp());
|
||||
assert_eq!(150, m.mana());
|
||||
assert_eq!("MyMonster", m.name());
|
||||
|
||||
@@ -20,7 +20,7 @@ fn main() {
|
||||
let mut buf = Vec::new();
|
||||
f.read_to_end(&mut buf).expect("file reading failed");
|
||||
|
||||
let monster = my_game::example::get_root_as_monster(&buf[..]);
|
||||
let monster = my_game::example::root_as_monster(&buf[..]).unwrap();
|
||||
println!("{}", monster.hp()); // `80`
|
||||
println!("{}", monster.mana()); // default value of `150`
|
||||
println!("{:?}", monster.name()); // Some("MyMonster")
|
||||
|
||||
@@ -177,9 +177,9 @@ fn serialized_example_is_accessible_and_correct(bytes: &[u8], identifier_require
|
||||
}
|
||||
|
||||
let m = if size_prefixed {
|
||||
my_game::example::get_size_prefixed_root_as_monster(bytes)
|
||||
my_game::example::size_prefixed_root_as_monster(bytes).unwrap()
|
||||
} else {
|
||||
my_game::example::get_root_as_monster(bytes)
|
||||
my_game::example::root_as_monster(bytes).unwrap()
|
||||
};
|
||||
|
||||
check_eq!(m.hp(), 80)?;
|
||||
@@ -245,6 +245,106 @@ fn builder_collapses_into_vec() {
|
||||
serialized_example_is_accessible_and_correct(&backing_buf[head..], true, false).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn verifier_one_byte_errors_do_not_crash() {
|
||||
let mut b = flatbuffers::FlatBufferBuilder::new();
|
||||
create_serialized_example_with_library_code(&mut b);
|
||||
let mut badbuf = b.finished_data().to_vec();
|
||||
// If the verifier says a buffer is okay then using it won't cause a crash.
|
||||
// We use write_fmt since Debug visits all the fields - but there's no need to store anything.
|
||||
struct ForgetfulWriter;
|
||||
use std::fmt::Write;
|
||||
impl Write for ForgetfulWriter {
|
||||
fn write_str(&mut self, _: &str) -> Result<(), std::fmt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
let mut w = ForgetfulWriter;
|
||||
for d in 1..=255u8 {
|
||||
for i in 0..badbuf.len() {
|
||||
let orig = badbuf[i];
|
||||
badbuf[i] = badbuf[i].wrapping_add(d);
|
||||
if let Ok(m) = flatbuffers::root::<my_game::example::Monster>(&badbuf) {
|
||||
w.write_fmt(format_args!("{:?}", m)).unwrap()
|
||||
}
|
||||
badbuf[i] = orig;
|
||||
}
|
||||
}
|
||||
}
|
||||
#[test]
|
||||
fn verifier_too_many_tables() {
|
||||
use my_game::example::*;
|
||||
let b = &mut flatbuffers::FlatBufferBuilder::new();
|
||||
let r = Referrable::create(b, &ReferrableArgs { id: 42 });
|
||||
let rs = b.create_vector(&vec![r; 500]);
|
||||
let name = Some(b.create_string("foo"));
|
||||
let m = Monster::create(b, &MonsterArgs {
|
||||
vector_of_referrables: Some(rs),
|
||||
name, // required field.
|
||||
..Default::default()
|
||||
});
|
||||
b.finish(m, None);
|
||||
|
||||
let data = b.finished_data();
|
||||
let mut opts = flatbuffers::VerifierOptions::default();
|
||||
|
||||
opts.max_tables = 500;
|
||||
let res = flatbuffers::root_with_opts::<Monster>(&opts, data);
|
||||
assert_eq!(res.unwrap_err(), flatbuffers::InvalidFlatbuffer::TooManyTables);
|
||||
|
||||
opts.max_tables += 2;
|
||||
assert!(flatbuffers::root_with_opts::<Monster>(&opts, data).is_ok());
|
||||
}
|
||||
#[test]
|
||||
fn verifier_apparent_size_too_large() {
|
||||
use my_game::example::*;
|
||||
let b = &mut flatbuffers::FlatBufferBuilder::new();
|
||||
let name = Some(b.create_string("foo"));
|
||||
// String amplification attack.
|
||||
let s = b.create_string(&(std::iter::repeat("X").take(1000).collect::<String>()));
|
||||
let testarrayofstring = Some(b.create_vector(&vec![s; 1000]));
|
||||
let m = Monster::create(b, &MonsterArgs {
|
||||
testarrayofstring,
|
||||
name, // required field.
|
||||
..Default::default()
|
||||
});
|
||||
b.finish(m, None);
|
||||
let data = b.finished_data();
|
||||
assert!(data.len() < 5100); // est 4000 for the vector + 1000 for the string + 100 overhead.
|
||||
let mut opts = flatbuffers::VerifierOptions::default();
|
||||
opts.max_apparent_size = 1_000_000;
|
||||
|
||||
let res = flatbuffers::root_with_opts::<Monster>(&opts, data);
|
||||
assert_eq!(res.unwrap_err(), flatbuffers::InvalidFlatbuffer::ApparentSizeTooLarge);
|
||||
|
||||
opts.max_apparent_size += 20_000;
|
||||
assert!(flatbuffers::root_with_opts::<Monster>(&opts, data).is_ok());
|
||||
}
|
||||
#[test]
|
||||
fn verifier_in_too_deep() {
|
||||
use my_game::example::*;
|
||||
let b = &mut flatbuffers::FlatBufferBuilder::new();
|
||||
let name = Some(b.create_string("foo"));
|
||||
let mut prev_monster = None;
|
||||
for _ in 0..11 {
|
||||
prev_monster = Some(Monster::create(b, &MonsterArgs {
|
||||
enemy: prev_monster,
|
||||
name, // required field.
|
||||
..Default::default()
|
||||
}));
|
||||
};
|
||||
b.finish(prev_monster.unwrap(), None);
|
||||
let mut opts = flatbuffers::VerifierOptions::default();
|
||||
opts.max_depth = 10;
|
||||
|
||||
let data = b.finished_data();
|
||||
let res = flatbuffers::root_with_opts::<Monster>(&opts, data);
|
||||
assert_eq!(res.unwrap_err(), flatbuffers::InvalidFlatbuffer::DepthLimitReached);
|
||||
|
||||
opts.max_depth += 1;
|
||||
assert!(flatbuffers::root_with_opts::<Monster>(&opts, data).is_ok());
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod generated_constants {
|
||||
extern crate flatbuffers;
|
||||
@@ -316,7 +416,7 @@ mod lifetime_correctness {
|
||||
let slice: &[u8] = &buf;
|
||||
let slice: &'static [u8] = unsafe { mem::transmute(slice) };
|
||||
// make sure values retrieved from the 'static buffer are themselves 'static
|
||||
let monster: my_game::example::Monster<'static> = my_game::example::get_root_as_monster(slice);
|
||||
let monster: my_game::example::Monster<'static> = my_game::example::root_as_monster(slice).unwrap();
|
||||
// this line should compile:
|
||||
let name: Option<&'static str> = monster._tab.get::<flatbuffers::ForwardsUOffset<&str>>(my_game::example::Monster::VT_NAME, None);
|
||||
assert_eq!(name, Some("MyMonster"));
|
||||
@@ -334,7 +434,7 @@ mod lifetime_correctness {
|
||||
fn table_object_self_lifetime_in_closure() {
|
||||
// This test is designed to ensure that lifetimes for temporary intermediate tables aren't inflated beyond where the need to be.
|
||||
let buf = load_file("../monsterdata_test.mon").expect("missing monsterdata_test.mon");
|
||||
let monster = my_game::example::get_root_as_monster(&buf);
|
||||
let monster = my_game::example::root_as_monster(&buf).unwrap();
|
||||
let enemy: Option<my_game::example::Monster> = monster.enemy();
|
||||
// This line won't compile if "self" is required to live for the lifetime of buf above as the borrow disappears at the end of the closure.
|
||||
let enemy_of_my_enemy = enemy.map(|e| {
|
||||
@@ -357,7 +457,7 @@ mod roundtrip_generated_code {
|
||||
fn build_mon<'a, 'b>(builder: &'a mut flatbuffers::FlatBufferBuilder, args: &'b my_game::example::MonsterArgs) -> my_game::example::Monster<'a> {
|
||||
let mon = my_game::example::Monster::create(builder, &args);
|
||||
my_game::example::finish_monster_buffer(builder, mon);
|
||||
my_game::example::get_root_as_monster(builder.finished_data())
|
||||
my_game::example::root_as_monster(builder.finished_data()).unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -437,7 +537,7 @@ mod roundtrip_generated_code {
|
||||
my_game::example::finish_monster_buffer(b, outer);
|
||||
}
|
||||
|
||||
let mon = my_game::example::get_root_as_monster(b.finished_data());
|
||||
let mon = my_game::example::root_as_monster(b.finished_data()).unwrap();
|
||||
assert_eq!(mon.name(), "bar");
|
||||
assert_eq!(mon.test_type(), my_game::example::Any::Monster);
|
||||
assert_eq!(my_game::example::Monster::init_from_table(mon.test().unwrap()).name(),
|
||||
@@ -473,7 +573,7 @@ mod roundtrip_generated_code {
|
||||
my_game::example::finish_monster_buffer(b, outer);
|
||||
}
|
||||
|
||||
let mon = my_game::example::get_root_as_monster(b.finished_data());
|
||||
let mon = my_game::example::root_as_monster(b.finished_data()).unwrap();
|
||||
assert_eq!(mon.name(), "bar");
|
||||
assert_eq!(mon.enemy().unwrap().name(), "foo");
|
||||
}
|
||||
@@ -503,7 +603,7 @@ mod roundtrip_generated_code {
|
||||
my_game::example::finish_monster_buffer(b, outer);
|
||||
}
|
||||
|
||||
let mon = my_game::example::get_root_as_monster(b.finished_data());
|
||||
let mon = my_game::example::root_as_monster(b.finished_data()).unwrap();
|
||||
assert_eq!(mon.name(), "bar");
|
||||
assert_eq!(mon.testempty().unwrap().id(), Some("foo"));
|
||||
}
|
||||
@@ -540,12 +640,12 @@ mod roundtrip_generated_code {
|
||||
b1
|
||||
};
|
||||
|
||||
let m = my_game::example::get_root_as_monster(b1.finished_data());
|
||||
let m = my_game::example::root_as_monster(b1.finished_data()).unwrap();
|
||||
|
||||
assert!(m.testnestedflatbuffer().is_some());
|
||||
assert_eq!(m.testnestedflatbuffer().unwrap(), b0.finished_data());
|
||||
|
||||
let m2_a = my_game::example::get_root_as_monster(m.testnestedflatbuffer().unwrap());
|
||||
let m2_a = my_game::example::root_as_monster(m.testnestedflatbuffer().unwrap()).unwrap();
|
||||
assert_eq!(m2_a.hp(), 123);
|
||||
assert_eq!(m2_a.name(), "foobar");
|
||||
|
||||
@@ -799,7 +899,7 @@ mod generated_code_alignment_and_padding {
|
||||
my_game::example::finish_monster_buffer(b, mon);
|
||||
}
|
||||
let buf = b.finished_data();
|
||||
let mon = my_game::example::get_root_as_monster(buf);
|
||||
let mon = my_game::example::root_as_monster(buf).unwrap();
|
||||
let vec3 = mon.pos().unwrap();
|
||||
|
||||
let start_ptr = buf.as_ptr() as usize;
|
||||
@@ -835,7 +935,7 @@ mod generated_code_alignment_and_padding {
|
||||
my_game::example::finish_monster_buffer(b, mon);
|
||||
}
|
||||
let buf = b.finished_data();
|
||||
let mon = my_game::example::get_root_as_monster(buf);
|
||||
let mon = my_game::example::root_as_monster(buf).unwrap();
|
||||
let abilities = mon.testarrayofsortedstruct().unwrap();
|
||||
|
||||
let start_ptr = buf.as_ptr() as usize;
|
||||
@@ -1142,7 +1242,7 @@ mod framing_format {
|
||||
|
||||
// Access it.
|
||||
let buf = b.finished_data();
|
||||
let m = flatbuffers::get_size_prefixed_root::<my_game::example::Monster>(buf);
|
||||
let m = flatbuffers::size_prefixed_root::<my_game::example::Monster>(buf).unwrap();
|
||||
assert_eq!(m.mana(), 200);
|
||||
assert_eq!(m.hp(), 300);
|
||||
assert_eq!(m.name(), "bob");
|
||||
@@ -1538,7 +1638,7 @@ mod write_and_read_examples {
|
||||
create_serialized_example_with_generated_code(b);
|
||||
let buf = b.finished_data();
|
||||
serialized_example_is_accessible_and_correct(&buf, true, false).unwrap();
|
||||
let m = super::my_game::example::get_root_as_monster(buf);
|
||||
let m = super::my_game::example::root_as_monster(buf).unwrap();
|
||||
assert_eq!(
|
||||
format!("{:.5?}", &m),
|
||||
"Monster { pos: Some(Vec3 { x: 1.00000, y: 2.00000, z: 3.00000, \
|
||||
@@ -1728,7 +1828,7 @@ mod generated_key_comparisons {
|
||||
let builder = &mut flatbuffers::FlatBufferBuilder::new();
|
||||
super::create_serialized_example_with_library_code(builder);
|
||||
let buf = builder.finished_data();
|
||||
let a = my_game::example::get_root_as_monster(buf);
|
||||
let a = my_game::example::root_as_monster(buf).unwrap();
|
||||
|
||||
// preconditions
|
||||
assert_eq!(a.name(), "MyMonster");
|
||||
@@ -1744,7 +1844,7 @@ mod generated_key_comparisons {
|
||||
let builder = &mut flatbuffers::FlatBufferBuilder::new();
|
||||
super::create_serialized_example_with_library_code(builder);
|
||||
let buf = builder.finished_data();
|
||||
let a = my_game::example::get_root_as_monster(buf);
|
||||
let a = my_game::example::root_as_monster(buf).unwrap();
|
||||
let b = a.test_as_monster().unwrap();
|
||||
|
||||
// preconditions
|
||||
|
||||
@@ -27,13 +27,13 @@ macro_rules! make_test {
|
||||
);
|
||||
builder.finish(ss, None);
|
||||
|
||||
let s = flatbuffers::get_root::<ScalarStuff>(builder.finished_data());
|
||||
let s = flatbuffers::root::<ScalarStuff>(builder.finished_data()).unwrap();
|
||||
assert_eq!(s.$just(), $five);
|
||||
assert_eq!(s.$default(), $five);
|
||||
assert_eq!(s.$maybe(), Some($five));
|
||||
|
||||
// Test defaults are used when not specified.
|
||||
let s = flatbuffers::get_root::<ScalarStuff>(&[0; 8]);
|
||||
let s = flatbuffers::root::<ScalarStuff>(&[0; 8]).unwrap();
|
||||
assert_eq!(s.$just(), $zero);
|
||||
assert_eq!(s.$default(), $fortytwo);
|
||||
assert_eq!(s.$maybe(), None);
|
||||
|
||||
Reference in New Issue
Block a user