bincode/enc/
mod.rs

1//! Encoder-based structs and traits.
2
3mod encoder;
4mod impl_tuples;
5mod impls;
6
7use self::write::Writer;
8use crate::{config::Config, error::EncodeError, utils::Sealed};
9
10pub mod write;
11
12pub use self::encoder::EncoderImpl;
13
14/// Any source that can be encoded. This trait should be implemented for all types that you want to be able to use with any of the `encode_with` methods.
15///
16/// This trait will be automatically implemented if you enable the `derive` feature and add `#[derive(bincode::Encode)]` to your trait.
17///
18/// # Implementing this trait manually
19///
20/// If you want to implement this trait for your type, the easiest way is to add a `#[derive(bincode::Encode)]`, build and check your `target/generated/bincode/` folder. This should generate a `<Struct name>_Encode.rs` file.
21///
22/// For this struct:
23///
24/// ```
25/// struct Entity {
26///     pub x: f32,
27///     pub y: f32,
28/// }
29/// ```
30/// It will look something like:
31///
32/// ```
33/// # struct Entity {
34/// #     pub x: f32,
35/// #     pub y: f32,
36/// # }
37/// impl bincode::Encode for Entity {
38///     fn encode<E: bincode::enc::Encoder>(
39///         &self,
40///         encoder: &mut E,
41///     ) -> core::result::Result<(), bincode::error::EncodeError> {
42///         bincode::Encode::encode(&self.x, encoder)?;
43///         bincode::Encode::encode(&self.y, encoder)?;
44///         Ok(())
45///     }
46/// }
47/// ```
48///
49/// From here you can add/remove fields, or add custom logic.
50pub trait Encode {
51    /// Encode a given type.
52    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError>;
53}
54
55/// Helper trait to encode basic types into.
56pub trait Encoder: Sealed {
57    /// The concrete [Writer] type
58    type W: Writer;
59
60    /// The concrete [Config] type
61    type C: Config;
62
63    /// Returns a mutable reference to the writer
64    fn writer(&mut self) -> &mut Self::W;
65
66    /// Returns a reference to the config
67    fn config(&self) -> &Self::C;
68}
69
70impl<T> Encoder for &mut T
71where
72    T: Encoder,
73{
74    type W = T::W;
75
76    type C = T::C;
77
78    fn writer(&mut self) -> &mut Self::W {
79        T::writer(self)
80    }
81
82    fn config(&self) -> &Self::C {
83        T::config(self)
84    }
85}
86
87/// Encode the variant of the given option. Will not encode the option itself.
88#[inline]
89pub(crate) fn encode_option_variant<E: Encoder, T>(
90    encoder: &mut E,
91    value: &Option<T>,
92) -> Result<(), EncodeError> {
93    match value {
94        None => 0u8.encode(encoder),
95        Some(_) => 1u8.encode(encoder),
96    }
97}
98
99/// Encodes the length of any slice, container, etc into the given encoder
100#[inline]
101pub(crate) fn encode_slice_len<E: Encoder>(encoder: &mut E, len: usize) -> Result<(), EncodeError> {
102    (len as u64).encode(encoder)
103}