djkoloski / rust_serialization_benchmark

Benchmarks for rust serialization frameworks
527 stars 48 forks source link

Cannot compile on linux #26

Closed pvdrz closed 2 years ago

pvdrz commented 2 years ago

Hi I tried to run this project after installing capnproto and flatbuffers but I'm getting a bunch of compilation errors while calling cargo bench:

error[E0432]: unresolved imports `rust_serialization_benchmark::datasets::log::Log`, `rust_serialization_benchmark::datasets::log::Logs`
  --> benches/bench.rs:41:55
   |
41 |     use rust_serialization_benchmark::datasets::log::{Log, Logs};
   |                                                       ^^^  ^^^^ no `Logs` in `datasets::log`
   |                                                       |
   |                                                       no `Log` in `datasets::log`
   |                                                       help: a similar name exists in the module: `log`

error[E0432]: unresolved import `rust_serialization_benchmark::datasets::log::ArchivedAddress`
   --> benches/bench.rs:140:17
    |
140 |             use rust_serialization_benchmark::datasets::log::ArchivedAddress;
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `ArchivedAddress` in `datasets::log`

error[E0432]: unresolved imports `rust_serialization_benchmark::datasets::mesh::Mesh`, `rust_serialization_benchmark::datasets::mesh::Triangle`
   --> benches/bench.rs:188:56
    |
188 |     use rust_serialization_benchmark::datasets::mesh::{Mesh, Triangle};
    |                                                        ^^^^  ^^^^^^^^ no `Triangle` in `datasets::mesh`
    |                                                        |
    |                                                        no `Mesh` in `datasets::mesh`
    |                                                        help: a similar name exists in the module: `mesh`

error[E0432]: unresolved imports `rust_serialization_benchmark::datasets::minecraft_savedata::Player`, `rust_serialization_benchmark::datasets::minecraft_savedata::Players`
   --> benches/bench.rs:316:70
    |
316 |     use rust_serialization_benchmark::datasets::minecraft_savedata::{Player, Players};
    |                                                                      ^^^^^^  ^^^^^^^ no `Players` in `datasets::minecraft_savedata`
    |                                                                      |
    |                                                                      no `Player` in `datasets::minecraft_savedata`

error[E0432]: unresolved import `rust_serialization_benchmark::datasets::minecraft_savedata::ArchivedGameType`
   --> benches/bench.rs:404:17
    |
404 |             use rust_serialization_benchmark::datasets::minecraft_savedata::ArchivedGameType;
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `ArchivedGameType` in `datasets::minecraft_savedata`

error[E0433]: failed to resolve: could not find `cp` in `log`
  --> benches/bench.rs:79:70
   |
79 |             .get_root::<rust_serialization_benchmark::datasets::log::cp::logs::Reader>()
   |                                                                      ^^ could not find `cp` in `log`

error[E0433]: failed to resolve: could not find `fb` in `log`
  --> benches/bench.rs:98:62
   |
98 |                 rust_serialization_benchmark::datasets::log::fb::Logs,
   |                                                              ^^ could not find `fb` in `log`

error[E0433]: failed to resolve: could not find `fb` in `log`
   --> benches/bench.rs:108:82
    |
108 |                 flatbuffers::root::<rust_serialization_benchmark::datasets::log::fb::Logs>(bytes)
    |                                                                                  ^^ could not find `fb` in `log`

error[E0433]: failed to resolve: could not find `cp` in `mesh`
   --> benches/bench.rs:224:71
    |
224 |             .get_root::<rust_serialization_benchmark::datasets::mesh::cp::mesh::Reader>()
    |                                                                       ^^ could not find `cp` in `mesh`

error[E0433]: failed to resolve: could not find `fb` in `mesh`
   --> benches/bench.rs:241:63
    |
241 |                 rust_serialization_benchmark::datasets::mesh::fb::Mesh,
    |                                                               ^^ could not find `fb` in `mesh`

error[E0433]: failed to resolve: could not find `fb` in `mesh`
   --> benches/bench.rs:249:83
    |
249 |                 flatbuffers::root::<rust_serialization_benchmark::datasets::mesh::fb::Mesh>(bytes)
    |                                                                                   ^^ could not find `fb` in `mesh`

error[E0433]: failed to resolve: could not find `cp` in `minecraft_savedata`
   --> benches/bench.rs:351:106
    |
351 |         let data = message_reader.get_root::<rust_serialization_benchmark::datasets::minecraft_savedata::cp::players::Reader>().unwrap();
    |                                                                                                          ^^ could not find `cp` in `minecraft_savedata`

error[E0433]: failed to resolve: could not find `fb` in `minecraft_savedata`
   --> benches/bench.rs:367:77
    |
367 |                 rust_serialization_benchmark::datasets::minecraft_savedata::fb::Players,
    |                                                                             ^^ could not find `fb` in `minecraft_savedata`

error[E0433]: failed to resolve: could not find `fb` in `minecraft_savedata`
   --> benches/bench.rs:375:77
    |
375 |                 rust_serialization_benchmark::datasets::minecraft_savedata::fb::Players,
    |                                                                             ^^ could not find `fb` in `minecraft_savedata`

error[E0412]: cannot find type `LogsSchema` in module `rust_serialization_benchmark::datasets::log`
   --> benches/bench.rs:178:79
    |
178 |     data: alkahest::Unpacked<'a, rust_serialization_benchmark::datasets::log::LogsSchema>,
    |                                                                               ^^^^^^^^^^ not found in `rust_serialization_benchmark::datasets::log`

error[E0412]: cannot find type `MeshSchema` in module `rust_serialization_benchmark::datasets::mesh`
   --> benches/bench.rs:308:80
    |
308 |     mesh: alkahest::Unpacked<'a, rust_serialization_benchmark::datasets::mesh::MeshSchema>,
    |                                                                                ^^^^^^^^^^ not found in `rust_serialization_benchmark::datasets::mesh`

error[E0412]: cannot find type `PlayersSchema` in module `rust_serialization_benchmark::datasets::minecraft_savedata`
   --> benches/bench.rs:439:69
    |
439 |         rust_serialization_benchmark::datasets::minecraft_savedata::PlayersSchema,
    |                                                                     ^^^^^^^^^^^^^ not found in `rust_serialization_benchmark::datasets::minecraft_savedata`

error[E0609]: no field `logs` on type `&_`
  --> benches/bench.rs:58:25
   |
58 |         for log in data.logs.iter() {
   |                         ^^^^

error[E0609]: no field `logs` on type `&_`
   --> benches/bench.rs:133:29
    |
133 |             for log in data.logs.iter() {
    |                             ^^^^

error[E0599]: no method named `as_ref` found for struct `Pin<&mut _>` in the current scope
   --> benches/bench.rs:142:30
    |
142 |             for i in 0..logs.as_ref().logs.len() {
    |                              ^^^^^^ method not found in `Pin<&mut _>`
    |
    = note: the method was found for
            - `Pin<P>`
    = note: `logs` is a function, perhaps you wish to call it

error[E0599]: no method named `as_mut` found for struct `Pin<&mut _>` in the current scope
   --> benches/bench.rs:143:36
    |
143 |                 let mut log = logs.as_mut().logs_pin().index_pin(i);
    |                                    ^^^^^^ method not found in `Pin<&mut _>`
    |
    = note: the method was found for
            - `Pin<P>`
    = note: `logs` is a function, perhaps you wish to call it

error[E0609]: no field `triangles` on type `&_`
   --> benches/bench.rs:205:30
    |
205 |         for triangle in data.triangles.iter() {
    |                              ^^^^^^^^^

error[E0609]: no field `triangles` on type `&_`
   --> benches/bench.rs:272:34
    |
272 |             for triangle in mesh.triangles.iter() {
    |                                  ^^^^^^^^^

error[E0599]: no method named `as_ref` found for struct `Pin<&mut _>` in the current scope
   --> benches/bench.rs:277:30
    |
277 |             for i in 0..mesh.as_ref().triangles.len() {
    |                              ^^^^^^ method not found in `Pin<&mut _>`
    |
    = note: the method was found for
            - `Pin<P>`
    = note: `mesh` is a function, perhaps you wish to call it

error[E0599]: no method named `as_mut` found for struct `Pin<&mut _>` in the current scope
   --> benches/bench.rs:278:41
    |
278 |                 let mut triangle = mesh.as_mut().triangles_pin().index_pin(i);
    |                                         ^^^^^^ method not found in `Pin<&mut _>`
    |
    = note: the method was found for
            - `Pin<P>`
    = note: `mesh` is a function, perhaps you wish to call it

error[E0609]: no field `players` on type `&_`
   --> benches/bench.rs:333:28
    |
333 |         for player in data.players.iter() {
    |                            ^^^^^^^

error[E0609]: no field `players` on type `&_`
   --> benches/bench.rs:399:32
    |
399 |             for player in data.players.iter() {
    |                                ^^^^^^^

error[E0599]: no method named `as_ref` found for struct `Pin<&mut _>` in the current scope
   --> benches/bench.rs:406:33
    |
406 |             for i in 0..players.as_ref().players.len() {
    |                                 ^^^^^^ method not found in `Pin<&mut _>`
    |
    = note: the method was found for
            - `Pin<P>`
    = note: `players` is a function, perhaps you wish to call it

error[E0599]: no method named `as_mut` found for struct `Pin<&mut _>` in the current scope
   --> benches/bench.rs:407:42
    |
407 |                 let mut player = players.as_mut().players_pin().index_pin(i);
    |                                          ^^^^^^ method not found in `Pin<&mut _>`
    |
    = note: the method was found for
            - `Pin<P>`
    = note: `players` is a function, perhaps you wish to call it

Some errors have detailed explanations: E0412, E0432, E0433, E0599, E0609.
For more information about an error, try `rustc --explain E0412`.
error: could not compile `rust_serialization_benchmark` due to 29 previous errors
warning: build failed, waiting for other jobs to finish...
warning: `rust_serialization_benchmark` (lib test) generated 81 warnings (81 duplicates)
error: build failed

any idea why?

djkoloski commented 2 years ago

This looks very confusing to me. Can you verify that src/datasets/log/mod.rs is unmodified from your source checkout? It should definitely define Log and Logs from the first error.

pvdrz commented 2 years ago

they are unmodified before i run cargo bench. But running that command changes them:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   src/datasets/log/mod.rs
    modified:   src/datasets/mesh/mod.rs
    modified:   src/datasets/minecraft_savedata/mod.rs

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    src/datasets/log/log/
    src/datasets/mesh/mesh/
    src/datasets/minecraft_savedata/minecraft_savedata/
djkoloski commented 2 years ago

It's likely that something in build.rs is stomping over those files. Could you open up the mod.rs files and check to see if they start with any of these comment headers?

bebop:

//!
//! This code was generated by a tool.
//!
//!
//!   bebopc version:
...

capnp:

// @generated by the capnpc-rust plugin to the Cap'n Proto schema compiler.
...

flatbuffers:

// automatically generated by the FlatBuffers compiler, do not modify
pvdrz commented 2 years ago

yeah, they start with those headers.

djkoloski commented 2 years ago

Great, which one? That will help narrow down which one is misbehaving. These files should be generating into *_bebop.rs, *_capnp.rs, and *_generated.rs respectively. Generating over mod.rs is clearly incorrect behavior.

pvdrz commented 2 years ago

I'm not sure I'm following. This is the diff after building:

diff --git a/src/datasets/log/mod.rs b/src/datasets/log/mod.rs
index f2d943a..128fb7a 100644
--- a/src/datasets/log/mod.rs
+++ b/src/datasets/log/mod.rs
@@ -1,397 +1,10 @@
-#[cfg(feature = "bebop")]
-pub mod log_bebop;
-#[cfg(feature = "capnp")]
-pub mod log_capnp;
-#[cfg(feature = "flatbuffers")]
-#[path = "log_generated.rs"]
-pub mod log_fb;
-#[cfg(feature = "prost")]
-pub mod log_prost {
-    include!(concat!(env!("OUT_DIR"), "/prost.log.rs"));
-}
-
-#[cfg(feature = "capnp")]
-use crate::bench_capnp;
-#[cfg(feature = "flatbuffers")]
-use crate::bench_flatbuffers;
-#[cfg(feature = "prost")]
-use crate::bench_prost;
-use crate::Generate;
-#[cfg(feature = "flatbuffers")]
-use flatbuffers::{FlatBufferBuilder, WIPOffset};
-#[cfg(feature = "capnp")]
-pub use log_capnp as cp;
-#[cfg(feature = "flatbuffers")]
-pub use log_fb::log as fb;
-use rand::Rng;
-#[cfg(feature = "rkyv")]
-use rkyv::Archived;
-
-#[derive(Clone, Copy)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-#[cfg_attr(feature = "alkahest", derive(alkahest::Schema))]
-pub struct Address {
-    pub x0: u8,
-    pub x1: u8,
-    pub x2: u8,
-    pub x3: u8,
-}
-
-impl Generate for Address {
-    fn generate<R: Rng>(rand: &mut R) -> Self {
-        Self {
-            x0: rand.gen_range(0..=255),
-            x1: rand.gen_range(0..=255),
-            x2: rand.gen_range(0..=255),
-            x3: rand.gen_range(0..=255),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl Into<fb::Address> for Address {
-    #[inline]
-    fn into(self) -> fb::Address {
-        fb::Address::new(self.x0, self.x1, self.x2, self.x3)
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Address {
-    type Reader = cp::address::Reader<'a>;
-    type Builder = cp::address::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        builder.set_x0(self.x0);
-        builder.set_x1(self.x1);
-        builder.set_x2(self.x2);
-        builder.set_x3(self.x3);
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Address {
-    type Message = log_prost::Address;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.x0 = self.x0 as u32;
-        result.x1 = self.x1 as u32;
-        result.x2 = self.x2 as u32;
-        result.x3 = self.x3 as u32;
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<Address> for Address {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<Address>, usize) {
-        AddressPack {
-            x0: self.x0,
-            x1: self.x1,
-            x2: self.x2,
-            x3: self.x3,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct Log {
-    pub address: Address,
-    pub identity: String,
-    pub userid: String,
-    pub date: String,
-    pub request: String,
-    pub code: u16,
-    pub size: u64,
-}
-
-#[cfg(feature = "rkyv")]
-const _: () = {
-    use core::pin::Pin;
-
-    impl ArchivedLog {
-        pub fn address_pin(self: Pin<&mut Self>) -> Pin<&mut ArchivedAddress> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.address) }
-        }
-
-        pub fn code_pin(self: Pin<&mut Self>) -> Pin<&mut u16> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.code) }
-        }
-
-        pub fn size_pin(self: Pin<&mut Self>) -> Pin<&mut u64> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.size) }
-        }
-    }
-};
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct LogSchema {
-    pub address: Address,
-    pub identity: alkahest::Bytes,
-    pub userid: alkahest::Bytes,
-    pub date: alkahest::Bytes,
-    pub request: alkahest::Bytes,
-    pub code: u16,
-    pub size: u64,
-}
-
-impl Generate for Log {
-    fn generate<R: Rng>(rand: &mut R) -> Self {
-        const USERID: [&'static str; 9] = [
-            "-", "alice", "bob", "carmen", "david", "eric", "frank", "george", "harry",
-        ];
-        const MONTHS: [&'static str; 12] = [
-            "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
-        ];
-        const TIMEZONE: [&'static str; 25] = [
-            "-1200", "-1100", "-1000", "-0900", "-0800", "-0700", "-0600", "-0500", "-0400",
-            "-0300", "-0200", "-0100", "+0000", "+0100", "+0200", "+0300", "+0400", "+0500",
-            "+0600", "+0700", "+0800", "+0900", "+1000", "+1100", "+1200",
-        ];
-        let date = format!(
-            "{}/{}/{}:{}:{}:{} {}",
-            rand.gen_range(1..=28),
-            MONTHS[rand.gen_range(0..12)],
-            rand.gen_range(1970..=2021),
-            rand.gen_range(0..24),
-            rand.gen_range(0..60),
-            rand.gen_range(0..60),
-            TIMEZONE[rand.gen_range(0..25)],
-        );
-        const CODES: [u16; 63] = [
-            100, 101, 102, 103, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302,
-            303, 304, 305, 306, 307, 308, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410,
-            411, 412, 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431,
-            451, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511,
-        ];
-        const METHODS: [&'static str; 5] = ["GET", "POST", "PUT", "UPDATE", "DELETE"];
-        const ROUTES: [&'static str; 7] = [
-            "/favicon.ico",
-            "/css/index.css",
-            "/css/font-awsome.min.css",
-            "/img/logo-full.svg",
-            "/img/splash.jpg",
-            "/api/login",
-            "/api/logout",
-        ];
-        const PROTOCOLS: [&'static str; 4] = ["HTTP/1.0", "HTTP/1.1", "HTTP/2", "HTTP/3"];
-        let request = format!(
-            "{} {} {}",
-            METHODS[rand.gen_range(0..5)],
-            ROUTES[rand.gen_range(0..7)],
-            PROTOCOLS[rand.gen_range(0..4)],
-        );
-        Self {
-            address: Address::generate(rand),
-            identity: "-".into(),
-            userid: USERID[rand.gen_range(0..USERID.len())].into(),
-            date,
-            request,
-            code: CODES[rand.gen_range(0..CODES.len())],
-            size: rand.gen_range(0..100_000_000),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for Log {
-    type Target = fb::Log<'a>;
-
-    #[inline]
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        let address = self.address.into();
-
-        let identity = fbb.create_string(&self.identity);
-        let userid = fbb.create_string(&self.userid);
-        let date = fbb.create_string(&self.date);
-        let request = fbb.create_string(&self.request);
-
-        let mut builder = fb::LogBuilder::new(fbb);
-        builder.add_address(&address);
-        builder.add_identity(identity);
-        builder.add_userid(userid);
-        builder.add_date(date);
-        builder.add_request(request);
-        builder.add_code(self.code);
-        builder.add_size_(self.size);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Log {
-    type Reader = cp::log::Reader<'a>;
-    type Builder = cp::log::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        self.address
-            .serialize_capnp(&mut builder.reborrow().init_address());
-        builder.set_identity(&self.identity);
-        builder.set_userid(&self.userid);
-        builder.set_date(&self.date);
-        builder.set_request(&self.request);
-        builder.set_code(self.code);
-        builder.set_size(self.size);
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Log {
-    type Message = log_prost::Log;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.identity = self.identity.clone();
-        result.userid = self.userid.clone();
-        result.date = self.date.clone();
-        result.request = self.request.clone();
-        result.code = self.code as u32;
-        result.size = self.size;
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<LogSchema> for &'_ Log {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<LogSchema>, usize) {
-        LogSchemaPack {
-            address: self.address,
-            identity: self.identity.as_bytes(),
-            userid: self.userid.as_bytes(),
-            date: self.date.as_bytes(),
-            request: self.request.as_bytes(),
-            code: self.code,
-            size: self.size,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct Logs {
-    pub logs: Vec<Log>,
-}
-
-#[cfg(feature = "rkyv")]
-const _: () = {
-    use core::pin::Pin;
-
-    impl ArchivedLogs {
-        pub fn logs_pin(self: Pin<&mut Self>) -> Pin<&mut Archived<Vec<Log>>> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.logs) }
-        }
-    }
-};
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for Logs {
-    type Target = fb::Logs<'a>;
-
-    #[inline]
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        let mut logs = Vec::new();
-        for log in self.logs.iter() {
-            logs.push(log.serialize_fb(fbb));
-        }
-        let logs = fbb.create_vector(&logs);
-
-        let mut builder = fb::LogsBuilder::new(fbb);
-        builder.add_logs(logs);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Logs {
-    type Reader = cp::logs::Reader<'a>;
-    type Builder = cp::logs::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        let mut logs = builder.reborrow().init_logs(self.logs.len() as u32);
-        for (i, value) in self.logs.iter().enumerate() {
-            value.serialize_capnp(&mut logs.reborrow().get(i as u32));
-        }
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Logs {
-    type Message = log_prost::Logs;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        for log in self.logs.iter() {
-            result.logs.push(log.serialize_pb());
-        }
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct LogsSchema {
-    pub logs: alkahest::Seq<LogSchema>,
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<LogsSchema> for &'_ Logs {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<LogsSchema>, usize) {
-        LogsSchemaPack {
-            logs: self.logs.iter(),
-        }
-        .pack(offset, output)
-    }
-}
+// Automatically generated by the Flatbuffers compiler. Do not modify.
+pub mod log {
+  use super::*;
+  mod address_generated;
+  pub use self::address_generated::*;
+  mod log_generated;
+  pub use self::log_generated::*;
+  mod logs_generated;
+  pub use self::logs_generated::*;
+} // log
diff --git a/src/datasets/mesh/mod.rs b/src/datasets/mesh/mod.rs
index fbb5e73..4e14c6f 100644
--- a/src/datasets/mesh/mod.rs
+++ b/src/datasets/mesh/mod.rs
@@ -1,289 +1,10 @@
-#[cfg(feature = "capnp")]
-pub mod mesh_capnp;
-#[cfg(feature = "flatbuffers")]
-#[path = "mesh_generated.rs"]
-pub mod mesh_fb;
-#[cfg(feature = "prost")]
-pub mod mesh_prost {
-    include!(concat!(env!("OUT_DIR"), "/prost.mesh.rs"));
-}
-
-#[cfg(feature = "capnp")]
-use crate::bench_capnp;
-#[cfg(feature = "flatbuffers")]
-use crate::bench_flatbuffers;
-#[cfg(feature = "prost")]
-use crate::bench_prost;
-use crate::Generate;
-#[cfg(feature = "flatbuffers")]
-use flatbuffers::{FlatBufferBuilder, WIPOffset};
-#[cfg(feature = "capnp")]
-pub use mesh_capnp as cp;
-#[cfg(feature = "flatbuffers")]
-pub use mesh_fb::mesh as fb;
-use rand::Rng;
-#[cfg(feature = "rkyv")]
-use rkyv::Archived;
-
-#[derive(Clone, Copy)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-#[cfg_attr(feature = "alkahest", derive(alkahest::Schema))]
-pub struct Vector3 {
-    pub x: f32,
-    pub y: f32,
-    pub z: f32,
-}
-
-impl Generate for Vector3 {
-    fn generate<R: Rng>(rand: &mut R) -> Self {
-        Self {
-            x: rand.gen(),
-            y: rand.gen(),
-            z: rand.gen(),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl Into<fb::Vector3> for Vector3 {
-    #[inline]
-    fn into(self) -> fb::Vector3 {
-        fb::Vector3::new(self.x, self.y, self.z)
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Vector3 {
-    type Reader = cp::vector3::Reader<'a>;
-    type Builder = cp::vector3::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        builder.set_x(self.x);
-        builder.set_y(self.y);
-        builder.set_z(self.z);
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Vector3 {
-    type Message = mesh_prost::Vector3;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.x = self.x;
-        result.y = self.y;
-        result.z = self.z;
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<Vector3> for Vector3 {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<Self>, usize) {
-        Vector3Pack {
-            x: self.x,
-            y: self.y,
-            z: self.z,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone, Copy)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-#[cfg_attr(feature = "alkahest", derive(alkahest::Schema))]
-pub struct Triangle {
-    pub v0: Vector3,
-    pub v1: Vector3,
-    pub v2: Vector3,
-    pub normal: Vector3,
-}
-
-impl Generate for Triangle {
-    fn generate<R: Rng>(rand: &mut R) -> Self {
-        Self {
-            v0: Vector3::generate(rand),
-            v1: Vector3::generate(rand),
-            v2: Vector3::generate(rand),
-            normal: Vector3::generate(rand),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl Into<fb::Triangle> for Triangle {
-    #[inline]
-    fn into(self) -> fb::Triangle {
-        fb::Triangle::new(
-            &self.v0.into(),
-            &self.v1.into(),
-            &self.v2.into(),
-            &self.normal.into(),
-        )
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Triangle {
-    type Reader = cp::triangle::Reader<'a>;
-    type Builder = cp::triangle::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        self.v0.serialize_capnp(&mut builder.reborrow().init_v0());
-        self.v1.serialize_capnp(&mut builder.reborrow().init_v1());
-        self.v2.serialize_capnp(&mut builder.reborrow().init_v2());
-        self.normal
-            .serialize_capnp(&mut builder.reborrow().init_normal());
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Triangle {
-    type Message = mesh_prost::Triangle;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.v0 = Some(self.v0.serialize_pb());
-        result.v1 = Some(self.v1.serialize_pb());
-        result.v2 = Some(self.v2.serialize_pb());
-        result.normal = Some(self.normal.serialize_pb());
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<Triangle> for &'_ Triangle {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<Triangle>, usize) {
-        TrianglePack {
-            v0: self.v0,
-            v1: self.v1,
-            v2: self.v2,
-            normal: self.normal,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct Mesh {
-    pub triangles: Vec<Triangle>,
-}
-
-#[cfg(feature = "rkyv")]
-const _: () = {
-    use core::pin::Pin;
-
-    impl ArchivedMesh {
-        pub fn triangles_pin(self: Pin<&mut Self>) -> Pin<&mut Archived<Vec<Triangle>>> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.triangles) }
-        }
-    }
-};
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for Mesh {
-    type Target = fb::Mesh<'a>;
-
-    #[inline]
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        fbb.start_vector::<fb::Triangle>(self.triangles.len());
-        for triangle in self.triangles.iter().cloned() {
-            fbb.push::<fb::Triangle>(triangle.into());
-        }
-        let triangles = fbb.end_vector(self.triangles.len());
-
-        let mut builder = fb::MeshBuilder::new(fbb);
-        builder.add_triangles(triangles);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Mesh {
-    type Reader = cp::mesh::Reader<'a>;
-    type Builder = cp::mesh::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        let mut mesh = builder
-            .reborrow()
-            .init_triangles(self.triangles.len() as u32);
-        for (i, value) in self.triangles.iter().enumerate() {
-            value.serialize_capnp(&mut mesh.reborrow().get(i as u32));
-        }
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Mesh {
-    type Message = mesh_prost::Mesh;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        for triangle in self.triangles.iter() {
-            result.triangles.push(triangle.serialize_pb());
-        }
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct MeshSchema {
-    pub triangles: alkahest::Seq<Triangle>,
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<MeshSchema> for &'_ Mesh {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<MeshSchema>, usize) {
-        MeshSchemaPack {
-            triangles: self.triangles.iter(),
-        }
-        .pack(offset, output)
-    }
-}
+// Automatically generated by the Flatbuffers compiler. Do not modify.
+pub mod mesh {
+  use super::*;
+  mod vector_3_generated;
+  pub use self::vector_3_generated::*;
+  mod triangle_generated;
+  pub use self::triangle_generated::*;
+  mod mesh_generated;
+  pub use self::mesh_generated::*;
+} // mesh
diff --git a/src/datasets/minecraft_savedata/mod.rs b/src/datasets/minecraft_savedata/mod.rs
index acf9afa..95989b0 100644
--- a/src/datasets/minecraft_savedata/mod.rs
+++ b/src/datasets/minecraft_savedata/mod.rs
@@ -1,1286 +1,26 @@
-#[cfg(feature = "capnp")]
-pub mod minecraft_savedata_capnp;
-#[cfg(feature = "flatbuffers")]
-#[path = "minecraft_savedata_generated.rs"]
-pub mod minecraft_savedata_fb;
-#[cfg(feature = "prost")]
-pub mod minecraft_savedata_prost {
-    include!(concat!(env!("OUT_DIR"), "/prost.minecraft_savedata.rs"));
-}
-
-#[cfg(feature = "capnp")]
-use crate::bench_capnp;
-#[cfg(feature = "flatbuffers")]
-use crate::bench_flatbuffers;
-#[cfg(feature = "prost")]
-use crate::bench_prost;
-use crate::{generate_vec, Generate};
-#[cfg(feature = "flatbuffers")]
-use flatbuffers::{FlatBufferBuilder, WIPOffset};
-#[cfg(feature = "capnp")]
-pub use minecraft_savedata_capnp as cp;
-#[cfg(feature = "flatbuffers")]
-pub use minecraft_savedata_fb::minecraft_savedata as fb;
-#[cfg(feature = "prost")]
-use minecraft_savedata_prost as pb;
-use rand::Rng;
-#[cfg(feature = "rkyv")]
-use rkyv::Archived;
-
-#[derive(Clone, Copy)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-#[cfg_attr(feature = "alkahest", derive(alkahest::Schema))]
-#[repr(u8)]
-pub enum GameType {
-    Survival,
-    Creative,
-    Adventure,
-    Spectator,
-}
-
-impl Generate for GameType {
-    fn generate<R: Rng>(rand: &mut R) -> Self {
-        match rand.gen_range(0..4) {
-            0 => GameType::Survival,
-            1 => GameType::Creative,
-            2 => GameType::Adventure,
-            3 => GameType::Spectator,
-            _ => unreachable!(),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl Into<fb::GameType> for GameType {
-    #[inline]
-    fn into(self) -> fb::GameType {
-        match self {
-            GameType::Survival => fb::GameType::Survival,
-            GameType::Creative => fb::GameType::Creative,
-            GameType::Adventure => fb::GameType::Adventure,
-            GameType::Spectator => fb::GameType::Spectator,
-        }
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl Into<cp::GameType> for GameType {
-    #[inline]
-    fn into(self) -> cp::GameType {
-        match self {
-            GameType::Survival => cp::GameType::Survival,
-            GameType::Creative => cp::GameType::Creative,
-            GameType::Adventure => cp::GameType::Adventure,
-            GameType::Spectator => cp::GameType::Spectator,
-        }
-    }
-}
-
-#[cfg(feature = "prost")]
-impl Into<pb::GameType> for GameType {
-    #[inline]
-    fn into(self) -> pb::GameType {
-        match self {
-            GameType::Survival => pb::GameType::Survival,
-            GameType::Creative => pb::GameType::Creative,
-            GameType::Adventure => pb::GameType::Adventure,
-            GameType::Spectator => pb::GameType::Spectator,
-        }
-    }
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<GameType> for GameType {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<GameType>, usize) {
-        match self {
-            GameType::Survival => GameTypeSurvivalPack.pack(offset, output),
-            GameType::Creative => GameTypeCreativePack.pack(offset, output),
-            GameType::Adventure => GameTypeAdventurePack.pack(offset, output),
-            GameType::Spectator => GameTypeSpectatorPack.pack(offset, output),
-        }
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct Item {
-    pub count: i8,
-    pub slot: u8,
-    pub id: String,
-}
-
-impl Generate for Item {
-    fn generate<R: Rng>(rng: &mut R) -> Self {
-        const IDS: [&'static str; 8] = [
-            "dirt",
-            "stone",
-            "pickaxe",
-            "sand",
-            "gravel",
-            "shovel",
-            "chestplate",
-            "steak",
-        ];
-        Self {
-            count: rng.gen(),
-            slot: rng.gen(),
-            id: IDS[rng.gen_range(0..IDS.len())].to_string(),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for Item {
-    type Target = fb::Item<'a>;
-
-    #[inline]
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        let id = fbb.create_string(&self.id);
-
-        let mut builder = fb::ItemBuilder::new(fbb);
-        builder.add_count(self.count);
-        builder.add_slot(self.slot);
-        builder.add_id(id);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Item {
-    type Reader = cp::item::Reader<'a>;
-    type Builder = cp::item::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        builder.set_count(self.count);
-        builder.set_slot(self.slot);
-        builder.set_id(&self.id);
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Item {
-    type Message = pb::Item;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.count = self.count as i32;
-        result.slot = self.slot as u32;
-        result.id = self.id.clone();
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct ItemSchema {
-    pub count: i8,
-    pub slot: u8,
-    pub id: alkahest::Bytes,
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<ItemSchema> for &'_ Item {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<ItemSchema>, usize) {
-        ItemSchemaPack {
-            count: self.count,
-            slot: self.slot,
-            id: self.id.as_bytes(),
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone, Copy)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-#[cfg_attr(feature = "alkahest", derive(alkahest::Schema))]
-pub struct Abilities {
-    pub walk_speed: f32,
-    pub fly_speed: f32,
-    pub may_fly: bool,
-    pub flying: bool,
-    pub invulnerable: bool,
-    pub may_build: bool,
-    pub instabuild: bool,
-}
-
-impl Generate for Abilities {
-    fn generate<R: Rng>(rng: &mut R) -> Self {
-        Self {
-            walk_speed: rng.gen(),
-            fly_speed: rng.gen(),
-            may_fly: rng.gen_bool(0.5),
-            flying: rng.gen_bool(0.5),
-            invulnerable: rng.gen_bool(0.5),
-            may_build: rng.gen_bool(0.5),
-            instabuild: rng.gen_bool(0.5),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl Into<fb::Abilities> for Abilities {
-    #[inline]
-    fn into(self) -> fb::Abilities {
-        fb::Abilities::new(
-            self.walk_speed,
-            self.fly_speed,
-            self.may_fly,
-            self.flying,
-            self.invulnerable,
-            self.may_build,
-            self.instabuild,
-        )
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Abilities {
-    type Reader = cp::abilities::Reader<'a>;
-    type Builder = cp::abilities::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        builder.set_walk_speed(self.walk_speed);
-        builder.set_fly_speed(self.fly_speed);
-        builder.set_may_fly(self.may_fly);
-        builder.set_flying(self.flying);
-        builder.set_invulnerable(self.invulnerable);
-        builder.set_may_build(self.may_build);
-        builder.set_instabuild(self.instabuild);
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Abilities {
-    type Message = pb::Abilities;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.walk_speed = self.walk_speed;
-        result.fly_speed = self.fly_speed;
-        result.may_fly = self.may_fly;
-        result.flying = self.flying;
-        result.invulnerable = self.invulnerable;
-        result.may_build = self.may_build;
-        result.instabuild = self.instabuild;
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<Abilities> for Abilities {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<Abilities>, usize) {
-        AbilitiesPack {
-            walk_speed: self.walk_speed,
-            fly_speed: self.fly_speed,
-            may_fly: self.may_fly,
-            flying: self.flying,
-            invulnerable: self.invulnerable,
-            may_build: self.may_build,
-            instabuild: self.instabuild,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct Entity {
-    pub id: String,
-    pub pos: (f64, f64, f64),
-    pub motion: (f64, f64, f64),
-    pub rotation: (f32, f32),
-    pub fall_distance: f32,
-    pub fire: u16,
-    pub air: u16,
-    pub on_ground: bool,
-    pub no_gravity: bool,
-    pub invulnerable: bool,
-    pub portal_cooldown: i32,
-    pub uuid: [u32; 4],
-    pub custom_name: Option<String>,
-    pub custom_name_visible: bool,
-    pub silent: bool,
-    pub glowing: bool,
-}
-
-impl Generate for Entity {
-    fn generate<R: Rng>(rng: &mut R) -> Self {
-        const IDS: [&'static str; 8] = [
-            "cow", "sheep", "zombie", "skeleton", "spider", "creeper", "parrot", "bee",
-        ];
-        const CUSTOM_NAMES: [&'static str; 8] = [
-            "rainbow", "princess", "steve", "johnny", "missy", "coward", "fairy", "howard",
-        ];
-
-        Self {
-            id: IDS[rng.gen_range(0..IDS.len())].to_string(),
-            pos: <(f64, f64, f64) as Generate>::generate(rng),
-            motion: <(f64, f64, f64) as Generate>::generate(rng),
-            rotation: <(f32, f32) as Generate>::generate(rng),
-            fall_distance: rng.gen(),
-            fire: rng.gen(),
-            air: rng.gen(),
-            on_ground: rng.gen_bool(0.5),
-            no_gravity: rng.gen_bool(0.5),
-            invulnerable: rng.gen_bool(0.5),
-            portal_cooldown: rng.gen(),
-            uuid: <[u32; 4] as Generate>::generate(rng),
-            custom_name: <Option<()> as Generate>::generate(rng)
-                .map(|_| CUSTOM_NAMES[rng.gen_range(0..CUSTOM_NAMES.len())].to_string()),
-            custom_name_visible: rng.gen_bool(0.5),
-            silent: rng.gen_bool(0.5),
-            glowing: rng.gen_bool(0.5),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for Entity {
-    type Target = fb::Entity<'a>;
-
-    #[inline]
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        let id = fbb.create_string(&self.id);
-        let custom_name = self
-            .custom_name
-            .as_ref()
-            .map(|name| fbb.create_string(&name));
-
-        let pos = fb::Vector3d::new(self.pos.0, self.pos.1, self.pos.2);
-        let motion = fb::Vector3d::new(self.motion.0, self.motion.1, self.motion.2);
-        let rotation = fb::Vector2f::new(self.rotation.0, self.rotation.1);
-        let uuid = fb::Uuid::new(self.uuid[0], self.uuid[1], self.uuid[2], self.uuid[3]);
-
-        let mut builder = fb::EntityBuilder::new(fbb);
-        builder.add_id(id);
-        builder.add_pos(&pos);
-        builder.add_motion(&motion);
-        builder.add_rotation(&rotation);
-        builder.add_fall_distance(self.fall_distance);
-        builder.add_fire(self.fire);
-        builder.add_air(self.air);
-        builder.add_on_ground(self.on_ground);
-        builder.add_no_gravity(self.no_gravity);
-        builder.add_invulnerable(self.invulnerable);
-        builder.add_portal_cooldown(self.portal_cooldown);
-        builder.add_uuid(&uuid);
-        if let Some(custom_name) = custom_name {
-            builder.add_custom_name(custom_name);
-        }
-        builder.add_custom_name_visible(self.custom_name_visible);
-        builder.add_silent(self.silent);
-        builder.add_glowing(self.glowing);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Entity {
-    type Reader = cp::entity::Reader<'a>;
-    type Builder = cp::entity::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        builder.set_id(&self.id);
-        let mut pos = builder.reborrow().init_pos();
-        pos.set_x(self.pos.0);
-        pos.set_y(self.pos.1);
-        pos.set_z(self.pos.2);
-        let mut motion = builder.reborrow().init_motion();
-        motion.set_x(self.motion.0);
-        motion.set_y(self.motion.1);
-        motion.set_z(self.motion.2);
-        let mut rotation = builder.reborrow().init_rotation();
-        rotation.set_x(self.rotation.0);
-        rotation.set_y(self.rotation.1);
-        builder.set_fall_distance(self.fall_distance);
-        builder.set_fire(self.fire);
-        builder.set_air(self.air);
-        builder.set_on_ground(self.on_ground);
-        builder.set_no_gravity(self.no_gravity);
-        builder.set_invulnerable(self.invulnerable);
-        builder.set_portal_cooldown(self.portal_cooldown);
-        let mut uuid = builder.reborrow().init_uuid();
-        uuid.set_x0(self.uuid[0]);
-        uuid.set_x1(self.uuid[1]);
-        uuid.set_x2(self.uuid[2]);
-        uuid.set_x3(self.uuid[3]);
-        if let Some(ref custom_name) = self.custom_name {
-            builder.set_custom_name(custom_name);
-        }
-        builder.set_custom_name_visible(self.custom_name_visible);
-        builder.set_silent(self.silent);
-        builder.set_glowing(self.glowing);
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Entity {
-    type Message = pb::Entity;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.id = self.id.clone();
-        result.pos = Some({
-            let mut result = pb::Vector3d::default();
-            result.x = self.pos.0;
-            result.y = self.pos.1;
-            result.z = self.pos.2;
-            result
-        });
-        result.motion = Some({
-            let mut result = pb::Vector3d::default();
-            result.x = self.motion.0;
-            result.y = self.motion.1;
-            result.z = self.motion.2;
-            result
-        });
-        result.rotation = Some({
-            let mut result = pb::Vector2f::default();
-            result.x = self.rotation.0;
-            result.y = self.rotation.1;
-            result
-        });
-        result.fall_distance = self.fall_distance;
-        result.fire = self.fire as u32;
-        result.air = self.air as u32;
-        result.on_ground = self.on_ground;
-        result.no_gravity = self.no_gravity;
-        result.invulnerable = self.invulnerable;
-        result.portal_cooldown = self.portal_cooldown;
-        result.uuid = Some({
-            let mut result = pb::Uuid::default();
-            result.x0 = self.uuid[0];
-            result.x1 = self.uuid[1];
-            result.x2 = self.uuid[2];
-            result.x3 = self.uuid[3];
-            result
-        });
-        if let Some(ref custom_name) = self.custom_name {
-            result.custom_name = Some(custom_name.clone());
-        }
-        result.custom_name_visible = self.custom_name_visible;
-        result.silent = self.silent;
-        result.glowing = self.glowing;
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct EntitySchema {
-    pub id: alkahest::Bytes,
-    pub pos: (f64, f64, f64),
-    pub motion: (f64, f64, f64),
-    pub rotation: (f32, f32),
-    pub fall_distance: f32,
-    pub fire: u16,
-    pub air: u16,
-    pub on_ground: bool,
-    pub no_gravity: bool,
-    pub invulnerable: bool,
-    pub portal_cooldown: i32,
-    pub uuid: [u32; 4],
-    pub custom_name: Option<alkahest::Bytes>,
-    pub custom_name_visible: bool,
-    pub silent: bool,
-    pub glowing: bool,
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<EntitySchema> for &'_ Entity {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<EntitySchema>, usize) {
-        EntitySchemaPack {
-            id: self.id.as_bytes(),
-            pos: (self.pos.0, self.pos.1, self.pos.2),
-            motion: (self.motion.0, self.motion.1, self.motion.2),
-            rotation: (self.rotation.0, self.rotation.1),
-            fall_distance: self.fall_distance,
-            fire: self.fire,
-            air: self.air,
-            on_ground: self.on_ground,
-            no_gravity: self.no_gravity,
-            invulnerable: self.invulnerable,
-            portal_cooldown: self.portal_cooldown,
-            uuid: self.uuid,
-            custom_name: self.custom_name.as_ref().map(|s| s.as_bytes()),
-            custom_name_visible: self.custom_name_visible,
-            silent: self.silent,
-            glowing: self.glowing,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct RecipeBook {
-    pub recipes: Vec<String>,
-    pub to_be_displayed: Vec<String>,
-    pub is_filtering_craftable: bool,
-    pub is_gui_open: bool,
-    pub is_furnace_filtering_craftable: bool,
-    pub is_furnace_gui_open: bool,
-    pub is_blasting_furnace_filtering_craftable: bool,
-    pub is_blasting_furnace_gui_open: bool,
-    pub is_smoker_filtering_craftable: bool,
-    pub is_smoker_gui_open: bool,
-}
-
-impl Generate for RecipeBook {
-    fn generate<R: Rng>(rng: &mut R) -> Self {
-        const RECIPES: [&'static str; 8] = [
-            "pickaxe",
-            "torch",
-            "bow",
-            "crafting table",
-            "furnace",
-            "shears",
-            "arrow",
-            "tnt",
-        ];
-        const MAX_RECIPES: usize = 30;
-        const MAX_DISPLAYED_RECIPES: usize = 10;
-        Self {
-            recipes: generate_vec::<_, ()>(rng, 0..MAX_RECIPES)
-                .iter()
-                .map(|_| RECIPES[rng.gen_range(0..RECIPES.len())].to_string())
-                .collect(),
-            to_be_displayed: generate_vec::<_, ()>(rng, 0..MAX_DISPLAYED_RECIPES)
-                .iter()
-                .map(|_| RECIPES[rng.gen_range(0..RECIPES.len())].to_string())
-                .collect(),
-            is_filtering_craftable: rng.gen_bool(0.5),
-            is_gui_open: rng.gen_bool(0.5),
-            is_furnace_filtering_craftable: rng.gen_bool(0.5),
-            is_furnace_gui_open: rng.gen_bool(0.5),
-            is_blasting_furnace_filtering_craftable: rng.gen_bool(0.5),
-            is_blasting_furnace_gui_open: rng.gen_bool(0.5),
-            is_smoker_filtering_craftable: rng.gen_bool(0.5),
-            is_smoker_gui_open: rng.gen_bool(0.5),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for RecipeBook {
-    type Target = fb::RecipeBook<'a>;
-
-    #[inline]
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        let mut recipes = Vec::new();
-        for recipe in self.recipes.iter() {
-            recipes.push(fbb.create_string(recipe));
-        }
-        let recipes = fbb.create_vector(&recipes);
-
-        let mut to_be_displayed = Vec::new();
-        for name in self.to_be_displayed.iter() {
-            to_be_displayed.push(fbb.create_string(name));
-        }
-        let to_be_displayed = fbb.create_vector(&to_be_displayed);
-
-        let mut builder = fb::RecipeBookBuilder::new(fbb);
-        builder.add_recipes(recipes);
-        builder.add_to_be_displayed(to_be_displayed);
-        builder.add_is_filtering_craftable(self.is_filtering_craftable);
-        builder.add_is_gui_open(self.is_gui_open);
-        builder.add_is_furnace_filtering_craftable(self.is_furnace_filtering_craftable);
-        builder.add_is_furnace_gui_open(self.is_furnace_gui_open);
-        builder.add_is_blasting_furnace_filtering_craftable(
-            self.is_blasting_furnace_filtering_craftable,
-        );
-        builder.add_is_blasting_furnace_gui_open(self.is_blasting_furnace_gui_open);
-        builder.add_is_smoker_filtering_craftable(self.is_smoker_filtering_craftable);
-        builder.add_is_smoker_gui_open(self.is_smoker_gui_open);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for RecipeBook {
-    type Reader = cp::recipe_book::Reader<'a>;
-    type Builder = cp::recipe_book::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        let mut recipes = builder.reborrow().init_recipes(self.recipes.len() as u32);
-        for (i, recipe) in self.recipes.iter().enumerate() {
-            recipes.set(i as u32, recipe);
-        }
-        let mut to_be_displayed = builder
-            .reborrow()
-            .init_to_be_displayed(self.to_be_displayed.len() as u32);
-        for (i, name) in self.to_be_displayed.iter().enumerate() {
-            to_be_displayed.set(i as u32, name);
-        }
-        builder.set_is_filtering_craftable(self.is_filtering_craftable);
-        builder.set_is_gui_open(self.is_gui_open);
-        builder.set_is_furnace_filtering_craftable(self.is_furnace_filtering_craftable);
-        builder.set_is_furnace_gui_open(self.is_furnace_gui_open);
-        builder.set_is_blasting_furnace_filtering_craftable(
-            self.is_blasting_furnace_filtering_craftable,
-        );
-        builder.set_is_blasting_furnace_gui_open(self.is_blasting_furnace_gui_open);
-        builder.set_is_smoker_filtering_craftable(self.is_smoker_filtering_craftable);
-        builder.set_is_smoker_gui_open(self.is_smoker_gui_open);
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for RecipeBook {
-    type Message = pb::RecipeBook;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        for recipe in self.recipes.iter() {
-            result.recipes.push(recipe.clone());
-        }
-        for tbd in self.to_be_displayed.iter() {
-            result.to_be_displayed.push(tbd.clone());
-        }
-        result.is_filtering_craftable = self.is_filtering_craftable;
-        result.is_gui_open = self.is_gui_open;
-        result.is_furnace_filtering_craftable = self.is_furnace_filtering_craftable;
-        result.is_furnace_gui_open = self.is_furnace_gui_open;
-        result.is_blasting_furnace_filtering_craftable =
-            self.is_blasting_furnace_filtering_craftable;
-        result.is_blasting_furnace_gui_open = self.is_blasting_furnace_gui_open;
-        result.is_smoker_filtering_craftable = self.is_smoker_filtering_craftable;
-        result.is_smoker_gui_open = self.is_smoker_gui_open;
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct RecipeBookSchema {
-    pub recipes: alkahest::Seq<alkahest::Bytes>,
-    pub to_be_displayed: alkahest::Seq<alkahest::Bytes>,
-    pub is_filtering_craftable: bool,
-    pub is_gui_open: bool,
-    pub is_furnace_filtering_craftable: bool,
-    pub is_furnace_gui_open: bool,
-    pub is_blasting_furnace_filtering_craftable: bool,
-    pub is_blasting_furnace_gui_open: bool,
-    pub is_smoker_filtering_craftable: bool,
-    pub is_smoker_gui_open: bool,
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<RecipeBookSchema> for &'_ RecipeBook {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<RecipeBookSchema>, usize) {
-        RecipeBookSchemaPack {
-            recipes: self.recipes.iter().map(|s| s.as_bytes()),
-            to_be_displayed: self.to_be_displayed.iter().map(|s| s.as_bytes()),
-            is_filtering_craftable: self.is_filtering_craftable,
-            is_gui_open: self.is_gui_open,
-            is_furnace_filtering_craftable: self.is_furnace_filtering_craftable,
-            is_furnace_gui_open: self.is_furnace_gui_open,
-            is_blasting_furnace_filtering_craftable: self.is_blasting_furnace_filtering_craftable,
-            is_blasting_furnace_gui_open: self.is_blasting_furnace_gui_open,
-            is_smoker_filtering_craftable: self.is_smoker_filtering_craftable,
-            is_smoker_gui_open: self.is_smoker_gui_open,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct Player {
-    pub game_type: GameType,
-    pub previous_game_type: GameType,
-    pub score: i64,
-    pub dimension: String,
-    pub selected_item_slot: u32,
-    pub selected_item: Item,
-    pub spawn_dimension: Option<String>,
-    pub spawn_x: i64,
-    pub spawn_y: i64,
-    pub spawn_z: i64,
-    pub spawn_forced: Option<bool>,
-    pub sleep_timer: u16,
-    pub food_exhaustion_level: f32,
-    pub food_saturation_level: f32,
-    pub food_tick_timer: u32,
-    pub xp_level: u32,
-    pub xp_p: f32,
-    pub xp_total: i32,
-    pub xp_seed: i32,
-    pub inventory: Vec<Item>,
-    pub ender_items: Vec<Item>,
-    pub abilities: Abilities,
-    pub entered_nether_position: Option<(f64, f64, f64)>,
-    pub root_vehicle: Option<([u32; 4], Entity)>,
-    pub shoulder_entity_left: Option<Entity>,
-    pub shoulder_entity_right: Option<Entity>,
-    pub seen_credits: bool,
-    pub recipe_book: RecipeBook,
-}
-
-#[cfg(feature = "rkyv")]
-const _: () = {
-    use core::pin::Pin;
-
-    impl ArchivedPlayer {
-        pub fn game_type_pin(self: Pin<&mut Self>) -> Pin<&mut ArchivedGameType> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.game_type) }
-        }
-
-        pub fn spawn_x_pin(self: Pin<&mut Self>) -> Pin<&mut i64> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.spawn_x) }
-        }
-
-        pub fn spawn_y_pin(self: Pin<&mut Self>) -> Pin<&mut i64> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.spawn_y) }
-        }
-
-        pub fn spawn_z_pin(self: Pin<&mut Self>) -> Pin<&mut i64> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.spawn_z) }
-        }
-    }
-};
-
-impl Generate for Player {
-    fn generate<R: Rng>(rng: &mut R) -> Self {
-        const DIMENSIONS: [&'static str; 3] = ["overworld", "nether", "end"];
-        const MAX_ITEMS: usize = 40;
-        const MAX_ENDER_ITEMS: usize = 27;
-        Self {
-            game_type: GameType::generate(rng),
-            previous_game_type: GameType::generate(rng),
-            score: rng.gen(),
-            dimension: DIMENSIONS[rng.gen_range(0..DIMENSIONS.len())].to_string(),
-            selected_item_slot: rng.gen(),
-            selected_item: Item::generate(rng),
-            spawn_dimension: <Option<()> as Generate>::generate(rng)
-                .map(|_| DIMENSIONS[rng.gen_range(0..DIMENSIONS.len())].to_string()),
-            spawn_x: rng.gen(),
-            spawn_y: rng.gen(),
-            spawn_z: rng.gen(),
-            spawn_forced: <Option<bool> as Generate>::generate(rng),
-            sleep_timer: rng.gen(),
-            food_exhaustion_level: rng.gen(),
-            food_saturation_level: rng.gen(),
-            food_tick_timer: rng.gen(),
-            xp_level: rng.gen(),
-            xp_p: rng.gen(),
-            xp_total: rng.gen(),
-            xp_seed: rng.gen(),
-            inventory: generate_vec(rng, 0..MAX_ITEMS),
-            ender_items: generate_vec(rng, 0..MAX_ENDER_ITEMS),
-            abilities: Abilities::generate(rng),
-            entered_nether_position: <Option<(f64, f64, f64)> as Generate>::generate(rng),
-            root_vehicle: <Option<([u32; 4], Entity)> as Generate>::generate(rng),
-            shoulder_entity_left: <Option<Entity> as Generate>::generate(rng),
-            shoulder_entity_right: <Option<Entity> as Generate>::generate(rng),
-            seen_credits: rng.gen_bool(0.5),
-            recipe_book: RecipeBook::generate(rng),
-        }
-    }
-}
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for Player {
-    type Target = fb::Player<'a>;
-
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        let dimension = fbb.create_string(&self.dimension);
-        let selected_item = self.selected_item.serialize_fb(fbb);
-        let spawn_dimension = self.spawn_dimension.as_ref().map(|d| fbb.create_string(d));
-
-        let mut inventory = Vec::new();
-        for inventory_item in self.inventory.iter() {
-            inventory.push(inventory_item.serialize_fb(fbb));
-        }
-        let inventory = fbb.create_vector(&inventory);
-
-        let mut ender_items = Vec::new();
-        for ender_item in self.ender_items.iter() {
-            ender_items.push(ender_item.serialize_fb(fbb));
-        }
-        let ender_items = fbb.create_vector(&ender_items);
-
-        let abilities = self.abilities.into();
-        let entered_nether_position = self
-            .entered_nether_position
-            .map(|p| fb::Vector3d::new(p.0, p.1, p.2));
-        let root_vehicle = self.root_vehicle.as_ref().map(|v| {
-            let entity = Some(v.1.serialize_fb(fbb));
-            fb::Vehicle::create(
-                fbb,
-                &fb::VehicleArgs {
-                    param_0: v.0[0],
-                    param_1: v.0[1],
-                    param_2: v.0[2],
-                    param_3: v.0[3],
-                    entity,
-                },
-            )
-        });
-        let shoulder_entity_left = self
-            .shoulder_entity_left
-            .as_ref()
-            .map(|e| e.serialize_fb(fbb));
-        let shoulder_entity_right = self
-            .shoulder_entity_right
-            .as_ref()
-            .map(|e| e.serialize_fb(fbb));
-        let recipe_book = self.recipe_book.serialize_fb(fbb);
-
-        let mut builder = fb::PlayerBuilder::new(fbb);
-        builder.add_game_type(self.game_type.into());
-        builder.add_previous_game_type(self.previous_game_type.into());
-        builder.add_score(self.score);
-        builder.add_dimension(dimension);
-        builder.add_selected_item_slot(self.selected_item_slot);
-        builder.add_selected_item(selected_item);
-        if let Some(spawn_dimension) = spawn_dimension {
-            builder.add_spawn_dimension(spawn_dimension);
-        }
-        builder.add_spawn_x(self.spawn_x);
-        builder.add_spawn_y(self.spawn_y);
-        builder.add_spawn_z(self.spawn_z);
-        builder.add_spawn_forced(self.spawn_forced.unwrap_or(false));
-        builder.add_sleep_timer(self.sleep_timer);
-        builder.add_food_exhaustion_level(self.food_exhaustion_level);
-        builder.add_food_saturation_level(self.food_saturation_level);
-        builder.add_food_tick_timer(self.food_tick_timer);
-        builder.add_xp_level(self.xp_level);
-        builder.add_xp_p(self.xp_p);
-        builder.add_xp_total(self.xp_total);
-        builder.add_xp_seed(self.xp_seed);
-        builder.add_inventory(inventory);
-        builder.add_ender_items(ender_items);
-        builder.add_abilities(&abilities);
-        if let Some(ref entered_nether_position) = entered_nether_position {
-            builder.add_entered_nether_position(&entered_nether_position);
-        }
-        if let Some(root_vehicle) = root_vehicle {
-            builder.add_root_vehicle(root_vehicle);
-        }
-        if let Some(shoulder_entity_left) = shoulder_entity_left {
-            builder.add_shoulder_entity_left(shoulder_entity_left);
-        }
-        if let Some(shoulder_entity_right) = shoulder_entity_right {
-            builder.add_shoulder_entity_right(shoulder_entity_right);
-        }
-        builder.add_seen_credits(self.seen_credits);
-        builder.add_recipe_book(recipe_book);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Player {
-    type Reader = cp::player::Reader<'a>;
-    type Builder = cp::player::Builder<'a>;
-
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        builder.set_game_type(self.game_type.into());
-        builder.set_previous_game_type(self.previous_game_type.into());
-        builder.set_score(self.score);
-        builder.set_dimension(&self.dimension);
-        let mut selected_item = builder.reborrow().init_selected_item();
-        self.selected_item.serialize_capnp(&mut selected_item);
-        let mut spawn_dimension = builder.reborrow().init_spawn_dimension();
-        if let Some(ref value) = self.spawn_dimension {
-            spawn_dimension.set_some(value);
-        } else {
-            spawn_dimension.set_none(());
-        }
-        let mut spawn = builder.reborrow().init_spawn();
-        spawn.set_x(self.spawn_x);
-        spawn.set_y(self.spawn_y);
-        spawn.set_z(self.spawn_z);
-        let mut spawn_forced = builder.reborrow().init_spawn_forced();
-        if let Some(ref value) = self.spawn_forced {
-            spawn_forced.set_some(*value);
-        } else {
-            spawn_forced.set_none(());
-        }
-        builder.set_sleep_timer(self.sleep_timer);
-        builder.set_food_exhaustion_level(self.food_exhaustion_level);
-        builder.set_food_saturation_level(self.food_saturation_level);
-        builder.set_food_tick_timer(self.food_tick_timer);
-        builder.set_xp_level(self.xp_level);
-        builder.set_xp_p(self.xp_p);
-        builder.set_xp_total(self.xp_total);
-        builder.set_xp_seed(self.xp_seed);
-        let mut inventory = builder
-            .reborrow()
-            .init_inventory(self.inventory.len() as u32);
-        for (i, value) in self.inventory.iter().enumerate() {
-            value.serialize_capnp(&mut inventory.reborrow().get(i as u32));
-        }
-        let mut ender_items = builder
-            .reborrow()
-            .init_ender_items(self.ender_items.len() as u32);
-        for (i, value) in self.ender_items.iter().enumerate() {
-            value.serialize_capnp(&mut ender_items.reborrow().get(i as u32));
-        }
-        self.abilities
-            .serialize_capnp(&mut builder.reborrow().init_abilities());
-        let mut entered_nether_position = builder.reborrow().init_entered_nether_position();
-        if let Some(ref value) = self.entered_nether_position {
-            let mut builder = entered_nether_position.init_some();
-            builder.set_x(value.0);
-            builder.set_y(value.1);
-            builder.set_z(value.2);
-        } else {
-            entered_nether_position.set_none(());
-        }
-        let mut root_vehicle = builder.reborrow().init_root_vehicle();
-        if let Some(ref value) = self.root_vehicle {
-            let mut builder = root_vehicle.init_some();
-            let mut uuid = builder.reborrow().init_uuid();
-            uuid.set_x0(value.0[0]);
-            uuid.set_x1(value.0[1]);
-            uuid.set_x2(value.0[2]);
-            uuid.set_x3(value.0[3]);
-            value
-                .1
-                .serialize_capnp(&mut builder.reborrow().init_entity());
-        } else {
-            root_vehicle.set_none(());
-        }
-        let mut shoulder_entity_left = builder.reborrow().init_shoulder_entity_left();
-        if let Some(ref value) = self.shoulder_entity_left {
-            value.serialize_capnp(&mut shoulder_entity_left.init_some());
-        } else {
-            shoulder_entity_left.set_none(());
-        }
-        let mut shoulder_entity_right = builder.reborrow().init_shoulder_entity_right();
-        if let Some(ref value) = self.shoulder_entity_right {
-            value.serialize_capnp(&mut shoulder_entity_right.init_some());
-        } else {
-            shoulder_entity_right.set_none(());
-        }
-        builder.set_seen_credits(self.seen_credits);
-        self.recipe_book
-            .serialize_capnp(&mut builder.reborrow().init_recipe_book());
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Player {
-    type Message = pb::Player;
-
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        result.game_type = self.game_type as i32;
-        result.previous_game_type = self.previous_game_type as i32;
-        result.score = self.score;
-        result.dimension = self.dimension.clone();
-        result.selected_item_slot = self.selected_item_slot;
-        result.selected_item = Some(self.selected_item.serialize_pb());
-        result.spawn_dimension = self.spawn_dimension.clone();
-        result.spawn_x = self.spawn_x;
-        result.spawn_y = self.spawn_y;
-        result.spawn_z = self.spawn_z;
-        result.spawn_forced = self.spawn_forced;
-        result.sleep_timer = self.sleep_timer as u32;
-        result.food_exhaustion_level = self.food_exhaustion_level;
-        result.food_saturation_level = self.food_saturation_level;
-        result.food_tick_timer = self.food_tick_timer;
-        result.xp_level = self.xp_level as u32;
-        result.xp_p = self.xp_p;
-        result.xp_total = self.xp_total;
-        result.xp_seed = self.xp_seed;
-        for item in self.inventory.iter() {
-            result.inventory.push(item.serialize_pb());
-        }
-        for item in self.ender_items.iter() {
-            result.ender_items.push(item.serialize_pb());
-        }
-        result.abilities = Some(self.abilities.serialize_pb());
-        result.entered_nether_position = self.entered_nether_position.map(|p| {
-            let mut result = pb::Vector3d::default();
-            result.x = p.0;
-            result.y = p.1;
-            result.z = p.2;
-            result
-        });
-        result.root_vehicle = self.root_vehicle.as_ref().map(|v| {
-            let mut result = pb::Vehicle::default();
-            result.uuid = Some({
-                let mut result = pb::Uuid::default();
-                result.x0 = v.0[0];
-                result.x1 = v.0[1];
-                result.x2 = v.0[2];
-                result.x3 = v.0[3];
-                result
-            });
-            result.entity = Some(v.1.serialize_pb());
-            result
-        });
-        result.shoulder_entity_left = self.shoulder_entity_left.as_ref().map(|e| e.serialize_pb());
-        result.shoulder_entity_right = self
-            .shoulder_entity_right
-            .as_ref()
-            .map(|e| e.serialize_pb());
-        result.seen_credits = self.seen_credits;
-        result.recipe_book = Some(self.recipe_book.serialize_pb());
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct PlayerSchema {
-    pub game_type: GameType,
-    pub previous_game_type: GameType,
-    pub score: i64,
-    pub dimension: alkahest::Bytes,
-    pub selected_item_slot: u32,
-    pub selected_item: ItemSchema,
-    pub spawn_dimension: Option<alkahest::Bytes>,
-    pub spawn_x: i64,
-    pub spawn_y: i64,
-    pub spawn_z: i64,
-    pub spawn_forced: Option<bool>,
-    pub sleep_timer: u16,
-    pub food_exhaustion_level: f32,
-    pub food_saturation_level: f32,
-    pub food_tick_timer: u32,
-    pub xp_level: u32,
-    pub xp_p: f32,
-    pub xp_total: i32,
-    pub xp_seed: i32,
-    pub inventory: alkahest::Seq<ItemSchema>,
-    pub ender_items: alkahest::Seq<ItemSchema>,
-    pub abilities: Abilities,
-    pub entered_nether_position: Option<(f64, f64, f64)>,
-    pub root_vehicle: Option<([u32; 4], EntitySchema)>,
-    pub shoulder_entity_left: Option<EntitySchema>,
-    pub shoulder_entity_right: Option<EntitySchema>,
-    pub seen_credits: bool,
-    pub recipe_book: RecipeBookSchema,
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<PlayerSchema> for &'_ Player {
-    #[inline]
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<PlayerSchema>, usize) {
-        PlayerSchemaPack {
-            game_type: self.game_type,
-            previous_game_type: self.previous_game_type,
-            score: self.score,
-            dimension: self.dimension.as_bytes(),
-            selected_item_slot: self.selected_item_slot,
-            selected_item: &self.selected_item,
-            spawn_dimension: self.spawn_dimension.as_ref().map(|s| s.as_bytes()),
-            spawn_x: self.spawn_x,
-            spawn_y: self.spawn_y,
-            spawn_z: self.spawn_z,
-            spawn_forced: self.spawn_forced,
-            sleep_timer: self.sleep_timer,
-            food_exhaustion_level: self.food_exhaustion_level,
-            food_saturation_level: self.food_saturation_level,
-            food_tick_timer: self.food_tick_timer,
-            xp_level: self.xp_level,
-            xp_p: self.xp_p,
-            xp_total: self.xp_total,
-            xp_seed: self.xp_seed,
-            inventory: self.inventory.iter(),
-            ender_items: self.ender_items.iter(),
-            abilities: self.abilities,
-            entered_nether_position: self
-                .entered_nether_position
-                .as_ref()
-                .map(|p| (p.0, p.1, p.2)),
-            root_vehicle: self
-                .root_vehicle
-                .as_ref()
-                .map(|(array, entity)| (array, entity)),
-            shoulder_entity_left: self.shoulder_entity_left.as_ref(),
-            shoulder_entity_right: self.shoulder_entity_right.as_ref(),
-            seen_credits: self.seen_credits,
-            recipe_book: &self.recipe_book,
-        }
-        .pack(offset, output)
-    }
-}
-
-#[derive(Clone)]
-#[cfg_attr(feature = "abomonation", derive(abomonation_derive::Abomonation))]
-#[cfg_attr(
-    feature = "borsh",
-    derive(borsh::BorshSerialize, borsh::BorshDeserialize)
-)]
-#[cfg_attr(
-    feature = "rkyv",
-    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
-)]
-#[cfg_attr(feature = "rkyv", archive_attr(derive(bytecheck::CheckBytes)))]
-#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
-#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
-pub struct Players {
-    pub players: Vec<Player>,
-}
-
-#[cfg(feature = "rkyv")]
-const _: () = {
-    use core::pin::Pin;
-
-    impl ArchivedPlayers {
-        pub fn players_pin(self: Pin<&mut Self>) -> Pin<&mut Archived<Vec<Player>>> {
-            unsafe { self.map_unchecked_mut(|s| &mut s.players) }
-        }
-    }
-};
-
-#[cfg(feature = "flatbuffers")]
-impl<'a> bench_flatbuffers::Serialize<'a> for Players {
-    type Target = fb::Players<'a>;
-
-    #[inline]
-    fn serialize_fb<'b>(&self, fbb: &'b mut FlatBufferBuilder<'a>) -> WIPOffset<Self::Target>
-    where
-        'a: 'b,
-    {
-        let mut players = Vec::new();
-        for player in self.players.iter() {
-            players.push(player.serialize_fb(fbb));
-        }
-        let players = fbb.create_vector(&players);
-
-        let mut builder = fb::PlayersBuilder::new(fbb);
-        builder.add_players(players);
-        builder.finish()
-    }
-}
-
-#[cfg(feature = "capnp")]
-impl<'a> bench_capnp::Serialize<'a> for Players {
-    type Reader = cp::players::Reader<'a>;
-    type Builder = cp::players::Builder<'a>;
-
-    #[inline]
-    fn serialize_capnp(&self, builder: &mut Self::Builder) {
-        let mut players = builder.reborrow().init_players(self.players.len() as u32);
-        for (i, value) in self.players.iter().enumerate() {
-            value.serialize_capnp(&mut players.reborrow().get(i as u32));
-        }
-    }
-}
-
-#[cfg(feature = "prost")]
-impl bench_prost::Serialize for Players {
-    type Message = pb::Players;
-
-    #[inline]
-    fn serialize_pb(&self) -> Self::Message {
-        let mut result = Self::Message::default();
-        for player in self.players.iter() {
-            result.players.push(player.serialize_pb());
-        }
-        result
-    }
-}
-
-#[cfg(feature = "alkahest")]
-#[derive(alkahest::Schema)]
-pub struct PlayersSchema {
-    pub players: alkahest::Seq<PlayerSchema>,
-}
-
-#[cfg(feature = "alkahest")]
-impl alkahest::Pack<PlayersSchema> for &'_ Players {
-    fn pack(self, offset: usize, output: &mut [u8]) -> (alkahest::Packed<PlayersSchema>, usize) {
-        PlayersSchemaPack {
-            players: self.players.iter(),
-        }
-        .pack(offset, output)
-    }
-}
+// Automatically generated by the Flatbuffers compiler. Do not modify.
+pub mod minecraft_savedata {
+  use super::*;
+  mod game_type_generated;
+  pub use self::game_type_generated::*;
+  mod item_generated;
+  pub use self::item_generated::*;
+  mod abilities_generated;
+  pub use self::abilities_generated::*;
+  mod vector_2f_generated;
+  pub use self::vector_2f_generated::*;
+  mod vector_3d_generated;
+  pub use self::vector_3d_generated::*;
+  mod uuid_generated;
+  pub use self::uuid_generated::*;
+  mod entity_generated;
+  pub use self::entity_generated::*;
+  mod recipe_book_generated;
+  pub use self::recipe_book_generated::*;
+  mod vehicle_generated;
+  pub use self::vehicle_generated::*;
+  mod player_generated;
+  pub use self::player_generated::*;
+  mod players_generated;
+  pub use self::players_generated::*;
+} // minecraft_savedata
djkoloski commented 2 years ago

Okay, so it's specifically the flatbuffers compiler that's overwriting mod.rs. This may be a functionality change in flatc-rust, I'll put together a commit that specifies the output path more explicitly.

djkoloski commented 2 years ago

I was unable to reproduce this bug. I performed this in an Ubuntu WSL2 instance:

git clone https://github.com/djkoloski/rust_serialization_benchmark
cd rust_serialization_benchmark
sudo apt install capnproto
curl -L https://github.com/google/flatbuffers/releases/download/v2.0.0/Linux.flatc.binary.clang++-9.zip --output tools/flatc
unzip -o tools/flatc -d tools
chmod +x tools/flatc
export PATH=$PATH:`pwd`/tools
cargo bench

And it built successfully for me. Can you be more specific about the environment you're building in?

If applicable, it may be worth upgrading your local version of flatc, performing a fresh checkout, running cargo clean, and retrying the build.

pvdrz commented 2 years ago
* What distro are you running?

Archlinux

  • Are you using your package manager's distribution of flatbuffers-compiler or the artifact from their latest release? I use the version provided by the package manager
    $ flatc --version
    flatc version 2.0.5
  • If you previously installed an outdated version of flatc or capnp and built, did you run cargo clean afterward? I installed them before building but I ran cargo clean and rebuilt and it had no difference. Just in case here's the capnp version
    $ capnp --version
    Cap'n Proto version 0.9.1
djkoloski commented 2 years ago

It looks like this is the breaking change: https://github.com/google/flatbuffers/pull/6731. That PR changed the generated rust code to be split across multiple files. Passing an extra argument of --gen-onefile appears to resolve this issue.

Fixed by 657789a62c908329a8c5c6580b82ef740ab61627. This should work now.