rw_builder/
bincode.rs

1use anyhow::Result;
2
3use crate::{RwBuilder, SerDe};
4
5/// Type returned by the `bincode` function on the `RwBuilder` trait.
6/// It is itself not an `RwBuilder` so can't be chained further.
7/// This is why we call it a sink.
8#[derive(Debug)]
9pub struct Builder<B>
10where
11    B: RwBuilder,
12{
13    /// The inner builder it wraps
14    builder: B,
15}
16
17impl<B> Builder<B>
18where
19    B: RwBuilder,
20{
21    /// Factory function to wrap an inner builder
22    #[must_use]
23    pub const fn new(builder: B) -> Self {
24        Self { builder }
25    }
26}
27
28impl<B> SerDe for Builder<B>
29where
30    B: RwBuilder,
31    B::Reader: std::io::Read,
32    B::Writer: std::io::Write,
33{
34    fn load<T>(&self) -> Result<T>
35    where
36        T: for<'de> serde::de::Deserialize<'de>,
37    {
38        let result = bincode::deserialize_from(self.builder.reader()?)?;
39        Ok(result)
40    }
41
42    fn save<T>(&self, value: &T) -> Result<()>
43    where
44        T: serde::ser::Serialize,
45    {
46        bincode::serialize_into(self.builder.writer()?, value)?;
47        Ok(())
48    }
49}