/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::<_> |