Coverage Report

Created: 2026-07-13 08:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/bincode-2.0.1/src/de/mod.rs
Line
Count
Source
1
//! Decoder-based structs and traits.
2
3
mod decoder;
4
mod impl_core;
5
mod impl_tuples;
6
mod impls;
7
8
use self::{
9
    decoder::WithContext,
10
    read::{BorrowReader, Reader},
11
};
12
use crate::{
13
    config::{Config, InternalLimitConfig},
14
    error::DecodeError,
15
    utils::Sealed,
16
};
17
18
pub mod read;
19
20
pub use self::decoder::DecoderImpl;
21
22
/// Trait that makes a type able to be decoded, akin to serde's `DeserializeOwned` trait.
23
///
24
/// Some types may require specific contexts. For example, to decode arena-based collections, an arena allocator must be provided as a context. In these cases, the context type `Context` should be specified or bounded.
25
///
26
/// This trait should be implemented for types which do not have references to data in the reader. For types that contain e.g. `&str` and `&[u8]`, implement [BorrowDecode] instead.
27
///
28
/// Whenever you derive `Decode` for your type, the base trait `BorrowDecode` is automatically implemented.
29
///
30
/// This trait will be automatically implemented with unbounded `Context` if you enable the `derive` feature and add `#[derive(bincode::Decode)]` to your type. Note that if the type contains any lifetimes, `BorrowDecode` will be implemented instead.
31
///
32
/// # Implementing this trait manually
33
///
34
/// If you want to implement this trait for your type, the easiest way is to add a `#[derive(bincode::Decode)]`, build and check your `target/generated/bincode/` folder. This should generate a `<Struct name>_Decode.rs` file.
35
///
36
/// For this struct:
37
///
38
/// ```
39
/// struct Entity {
40
///     pub x: f32,
41
///     pub y: f32,
42
/// }
43
/// ```
44
///
45
/// It will look something like:
46
///
47
/// ```
48
/// # struct Entity {
49
/// #     pub x: f32,
50
/// #     pub y: f32,
51
/// # }
52
/// impl<Context> bincode::Decode<Context> for Entity {
53
///     fn decode<D: bincode::de::Decoder<Context = Context>>(
54
///         decoder: &mut D,
55
///     ) -> core::result::Result<Self, bincode::error::DecodeError> {
56
///         Ok(Self {
57
///             x: bincode::Decode::decode(decoder)?,
58
///             y: bincode::Decode::decode(decoder)?,
59
///         })
60
///     }
61
/// }
62
/// impl<'de, Context> bincode::BorrowDecode<'de, Context> for Entity {
63
///     fn borrow_decode<D: bincode::de::BorrowDecoder<'de, Context = Context>>(
64
///         decoder: &mut D,
65
///     ) -> core::result::Result<Self, bincode::error::DecodeError> {
66
///         Ok(Self {
67
///             x: bincode::BorrowDecode::borrow_decode(decoder)?,
68
///             y: bincode::BorrowDecode::borrow_decode(decoder)?,
69
///         })
70
///     }
71
/// }
72
/// ```
73
///
74
/// From here you can add/remove fields, or add custom logic.
75
///
76
/// To get specific integer types, you can use:
77
/// ```
78
/// # struct Foo;
79
/// # impl<Context> bincode::Decode<Context> for Foo {
80
/// #     fn decode<D: bincode::de::Decoder<Context = Context>>(
81
/// #         decoder: &mut D,
82
/// #     ) -> core::result::Result<Self, bincode::error::DecodeError> {
83
/// let x: u8 = bincode::Decode::<Context>::decode(decoder)?;
84
/// let x = <u8 as bincode::Decode::<Context>>::decode(decoder)?;
85
/// #         Ok(Foo)
86
/// #     }
87
/// # }
88
/// # bincode::impl_borrow_decode!(Foo);
89
/// ```
90
///
91
/// You can use `Context` to require contexts for decoding a type:
92
/// ```
93
/// # /// # use bumpalo::Bump;
94
/// use bincode::de::Decoder;
95
/// use bincode::error::DecodeError;
96
/// struct BytesInArena<'a>(bumpalo::collections::Vec<'a, u8>);
97
/// impl<'a> bincode::Decode<&'a bumpalo::Bump> for BytesInArena<'a> {
98
/// fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
99
///         todo!()
100
///     }
101
/// # }
102
/// ```
103
pub trait Decode<Context>: Sized {
104
    /// Attempt to decode this type with the given [Decode].
105
    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError>;
106
}
107
108
/// Trait that makes a type able to be decoded, akin to serde's `Deserialize` trait.
109
///
110
/// This trait should be implemented for types that contain borrowed data, like `&str` and `&[u8]`. If your type does not have borrowed data, consider implementing [Decode] instead.
111
///
112
/// This trait will be automatically implemented if you enable the `derive` feature and add `#[derive(bincode::Decode)]` to a type with a lifetime.
113
pub trait BorrowDecode<'de, Context>: Sized {
114
    /// Attempt to decode this type with the given [BorrowDecode].
115
    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
116
        decoder: &mut D,
117
    ) -> Result<Self, DecodeError>;
118
}
119
120
/// Helper macro to implement `BorrowDecode` for any type that implements `Decode`.
121
#[macro_export]
122
macro_rules! impl_borrow_decode {
123
    ($ty:ty $(, $param:tt)*) => {
124
        impl<'de $(, $param)*, __Context> $crate::BorrowDecode<'de, __Context> for $ty {
125
0
            fn borrow_decode<D: $crate::de::BorrowDecoder<'de, Context = __Context>>(
126
0
                decoder: &mut D,
127
0
            ) -> core::result::Result<Self, $crate::error::DecodeError> {
128
0
                $crate::Decode::decode(decoder)
129
0
            }
Unexecuted instantiation: <core::sync::atomic::AtomicBool as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicU8 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicU16 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicU32 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicU64 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicUsize as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicI8 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicI16 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicI32 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicI64 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::sync::atomic::AtomicIsize as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <usize as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<usize> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <i8 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<i8> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <i16 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<i16> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <i32 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<i32> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <i64 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<i64> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <i128 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<i128> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <isize as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<isize> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <f32 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <f64 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <char as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <() as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::marker::PhantomData<_> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::time::Duration as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <bool as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <u8 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<u8> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <u16 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<u16> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <u32 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<u32> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <u64 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<u64> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <u128 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::num::nonzero::NonZero<u128> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <alloc::string::String as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <alloc::boxed::Box<str> as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <alloc::ffi::c_str::CString as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <std::time::SystemTime as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <std::path::PathBuf as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::net::ip_addr::IpAddr as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::net::ip_addr::Ipv4Addr as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::net::ip_addr::Ipv6Addr as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::net::socket_addr::SocketAddr as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::net::socket_addr::SocketAddrV4 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
Unexecuted instantiation: <core::net::socket_addr::SocketAddrV6 as bincode::de::BorrowDecode<_>>::borrow_decode::<_>
130
        }
131
    };
132
}
133
134
/// Helper macro to implement `BorrowDecode` for any type that implements `Decode`.
135
#[macro_export]
136
macro_rules! impl_borrow_decode_with_context {
137
    ($ty:ty, $context:ty $(, $param:tt)*) => {
138
        impl<'de $(, $param)*> $crate::BorrowDecode<'de, $context> for $ty {
139
            fn borrow_decode<D: $crate::de::BorrowDecoder<'de, Context = $context>>(
140
                decoder: &mut D,
141
            ) -> core::result::Result<Self, $crate::error::DecodeError> {
142
                $crate::Decode::decode(decoder)
143
            }
144
        }
145
    };
146
}
147
148
/// Any source that can decode basic types. This type is most notably implemented for [Decoder].
149
pub trait Decoder: Sealed {
150
    /// The concrete [Reader] type
151
    type R: Reader;
152
153
    /// The concrete [Config] type
154
    type C: Config;
155
156
    /// The decoding context type
157
    type Context;
158
159
    /// Returns the decoding context
160
    fn context(&mut self) -> &mut Self::Context;
161
162
    /// Wraps decoder with a context
163
0
    fn with_context<C>(&mut self, context: C) -> WithContext<Self, C> {
164
0
        WithContext {
165
0
            decoder: self,
166
0
            context,
167
0
        }
168
0
    }
169
170
    /// Returns a mutable reference to the reader
171
    fn reader(&mut self) -> &mut Self::R;
172
173
    /// Returns a reference to the config
174
    fn config(&self) -> &Self::C;
175
176
    /// Claim that `n` bytes are going to be read from the decoder.
177
    /// This can be used to validate `Configuration::Limit<N>()`.
178
    fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError>;
179
180
    /// Claim that we're going to read a container which contains `len` entries of `T`.
181
    /// This will correctly handle overflowing if `len * size_of::<T>() > usize::max_value`
182
0
    fn claim_container_read<T>(&mut self, len: usize) -> Result<(), DecodeError> {
183
0
        if <Self::C as InternalLimitConfig>::LIMIT.is_some() {
184
0
            match len.checked_mul(core::mem::size_of::<T>()) {
185
0
                Some(val) => self.claim_bytes_read(val),
186
0
                None => Err(DecodeError::LimitExceeded),
187
            }
188
        } else {
189
0
            Ok(())
190
        }
191
0
    }
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut std::io::buffered::bufreader::BufReader<std::fs::File>>, bincode::config::Configuration, ()> as bincode::de::Decoder>::claim_container_read::<u8>
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut surrealmx::compression::CompressedReader>, bincode::config::Configuration, ()> as bincode::de::Decoder>::claim_container_read::<u8>
Unexecuted instantiation: <_ as bincode::de::Decoder>::claim_container_read::<_>
192
193
    /// Notify the decoder that `n` bytes are being reclaimed.
194
    ///
195
    /// When decoding container types, a typical implementation would claim to read `len * size_of::<T>()` bytes.
196
    /// This is to ensure that bincode won't allocate several GB of memory while constructing the container.
197
    ///
198
    /// Because the implementation claims `len * size_of::<T>()`, but then has to decode each `T`, this would be marked
199
    /// as double. This function allows us to un-claim each `T` that gets decoded.
200
    ///
201
    /// We cannot check if `len * size_of::<T>()` is valid without claiming it, because this would mean that if you have
202
    /// a nested container (e.g. `Vec<Vec<T>>`), it does not know how much memory is already claimed, and could easily
203
    /// allocate much more than the user intends.
204
    /// ```
205
    /// # use bincode::de::{Decode, Decoder};
206
    /// # use bincode::error::DecodeError;
207
    /// # struct Container<T>(Vec<T>);
208
    /// # impl<T> Container<T> {
209
    /// #     fn with_capacity(cap: usize) -> Self {
210
    /// #         Self(Vec::with_capacity(cap))
211
    /// #     }
212
    /// #     
213
    /// #     fn push(&mut self, t: T) {
214
    /// #         self.0.push(t);
215
    /// #     }
216
    /// # }
217
    /// impl<Context, T: Decode<Context>> Decode<Context> for Container<T> {
218
    ///     fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
219
    ///         let len = u64::decode(decoder)?;
220
    ///         let len: usize = len.try_into().map_err(|_| DecodeError::OutsideUsizeRange(len))?;
221
    ///         // Make sure we don't allocate too much memory
222
    ///         decoder.claim_bytes_read(len * core::mem::size_of::<T>());
223
    ///
224
    ///         let mut result = Container::with_capacity(len);
225
    ///         for _ in 0..len {
226
    ///             // un-claim the memory
227
    ///             decoder.unclaim_bytes_read(core::mem::size_of::<T>());
228
    ///             result.push(T::decode(decoder)?)
229
    ///         }
230
    ///         Ok(result)
231
    ///     }
232
    /// }
233
    /// impl<'de, Context, T: bincode::BorrowDecode<'de, Context>> bincode::BorrowDecode<'de, Context> for Container<T> {
234
    ///     fn borrow_decode<D: bincode::de::BorrowDecoder<'de, Context = Context>>(
235
    ///         decoder: &mut D,
236
    ///     ) -> core::result::Result<Self, bincode::error::DecodeError> {
237
    ///         let len = u64::borrow_decode(decoder)?;
238
    ///         let len: usize = len.try_into().map_err(|_| DecodeError::OutsideUsizeRange(len))?;
239
    ///         // Make sure we don't allocate too much memory
240
    ///         decoder.claim_bytes_read(len * core::mem::size_of::<T>());
241
    ///
242
    ///         let mut result = Container::with_capacity(len);
243
    ///         for _ in 0..len {
244
    ///             // un-claim the memory
245
    ///             decoder.unclaim_bytes_read(core::mem::size_of::<T>());
246
    ///             result.push(T::borrow_decode(decoder)?)
247
    ///         }
248
    ///         Ok(result)
249
    ///     }
250
    /// }
251
    /// ```
252
    fn unclaim_bytes_read(&mut self, n: usize);
253
}
254
255
/// Any source that can decode basic types. This type is most notably implemented for [Decoder].
256
///
257
/// This is an extension of [Decode] that can also return borrowed data.
258
pub trait BorrowDecoder<'de>: Decoder {
259
    /// The concrete [BorrowReader] type
260
    type BR: BorrowReader<'de>;
261
262
    /// Rerturns a mutable reference to the borrow reader
263
    fn borrow_reader(&mut self) -> &mut Self::BR;
264
}
265
266
impl<T> Decoder for &mut T
267
where
268
    T: Decoder,
269
{
270
    type R = T::R;
271
272
    type C = T::C;
273
274
    type Context = T::Context;
275
276
0
    fn reader(&mut self) -> &mut Self::R {
277
0
        T::reader(self)
278
0
    }
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut std::io::buffered::bufreader::BufReader<std::fs::File>>, bincode::config::Configuration, ()> as bincode::de::Decoder>::reader
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut surrealmx::compression::CompressedReader>, bincode::config::Configuration, ()> as bincode::de::Decoder>::reader
Unexecuted instantiation: <&mut _ as bincode::de::Decoder>::reader
279
280
0
    fn config(&self) -> &Self::C {
281
0
        T::config(self)
282
0
    }
283
284
    #[inline]
285
0
    fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError> {
286
0
        T::claim_bytes_read(self, n)
287
0
    }
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut std::io::buffered::bufreader::BufReader<std::fs::File>>, bincode::config::Configuration, ()> as bincode::de::Decoder>::claim_bytes_read
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut surrealmx::compression::CompressedReader>, bincode::config::Configuration, ()> as bincode::de::Decoder>::claim_bytes_read
Unexecuted instantiation: <&mut _ as bincode::de::Decoder>::claim_bytes_read
288
289
    #[inline]
290
0
    fn unclaim_bytes_read(&mut self, n: usize) {
291
0
        T::unclaim_bytes_read(self, n)
292
0
    }
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut std::io::buffered::bufreader::BufReader<std::fs::File>>, bincode::config::Configuration, ()> as bincode::de::Decoder>::unclaim_bytes_read
Unexecuted instantiation: <&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut surrealmx::compression::CompressedReader>, bincode::config::Configuration, ()> as bincode::de::Decoder>::unclaim_bytes_read
Unexecuted instantiation: <&mut _ as bincode::de::Decoder>::unclaim_bytes_read
293
294
0
    fn context(&mut self) -> &mut Self::Context {
295
0
        T::context(self)
296
0
    }
297
}
298
299
impl<'de, T> BorrowDecoder<'de> for &mut T
300
where
301
    T: BorrowDecoder<'de>,
302
{
303
    type BR = T::BR;
304
305
0
    fn borrow_reader(&mut self) -> &mut Self::BR {
306
0
        T::borrow_reader(self)
307
0
    }
308
}
309
310
/// Decodes only the option variant from the decoder. Will not read any more data than that.
311
#[inline]
312
0
pub(crate) fn decode_option_variant<D: Decoder>(
313
0
    decoder: &mut D,
314
0
    type_name: &'static str,
315
0
) -> Result<Option<()>, DecodeError> {
316
0
    let is_some = u8::decode(decoder)?;
317
0
    match is_some {
318
0
        0 => Ok(None),
319
0
        1 => Ok(Some(())),
320
0
        x => Err(DecodeError::UnexpectedVariant {
321
0
            found: x as u32,
322
0
            allowed: &crate::error::AllowedEnumVariants::Range { max: 1, min: 0 },
323
0
            type_name,
324
0
        }),
325
    }
326
0
}
Unexecuted instantiation: bincode::de::decode_option_variant::<&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut std::io::buffered::bufreader::BufReader<std::fs::File>>, bincode::config::Configuration, ()>>
Unexecuted instantiation: bincode::de::decode_option_variant::<&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut surrealmx::compression::CompressedReader>, bincode::config::Configuration, ()>>
Unexecuted instantiation: bincode::de::decode_option_variant::<_>
327
328
/// Decodes the length of any slice, container, etc from the decoder
329
#[inline]
330
0
pub(crate) fn decode_slice_len<D: Decoder>(decoder: &mut D) -> Result<usize, DecodeError> {
331
0
    let v = u64::decode(decoder)?;
332
333
0
    v.try_into().map_err(|_| DecodeError::OutsideUsizeRange(v))
Unexecuted instantiation: bincode::de::decode_slice_len::<&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut std::io::buffered::bufreader::BufReader<std::fs::File>>, bincode::config::Configuration, ()>>::{closure#0}
Unexecuted instantiation: bincode::de::decode_slice_len::<&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut surrealmx::compression::CompressedReader>, bincode::config::Configuration, ()>>::{closure#0}
Unexecuted instantiation: bincode::de::decode_slice_len::<_>::{closure#0}
334
0
}
Unexecuted instantiation: bincode::de::decode_slice_len::<&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut std::io::buffered::bufreader::BufReader<std::fs::File>>, bincode::config::Configuration, ()>>
Unexecuted instantiation: bincode::de::decode_slice_len::<&mut bincode::de::decoder::DecoderImpl<bincode::features::impl_std::IoReader<&mut surrealmx::compression::CompressedReader>, bincode::config::Configuration, ()>>
Unexecuted instantiation: bincode::de::decode_slice_len::<_>