Skip to main content

rw_builder/
wincode.rs

1use crate::Result;
2
3use crate::RwBuilder;
4use wincode::io::{std_read::ReadAdapter, std_write::WriteAdapter, Writer};
5
6/// Type returned by the `wincode` function on the `RwBuilder` trait.
7/// It is itself not an `RwBuilder` so can't be chained further.
8/// This is why we call it a sink.
9///
10/// Note: This builder provides `load` and `save` methods for serialization.
11/// Due to wincode's schema trait requirements, types must implement both
12/// `serde` traits and `wincode`'s `SchemaRead`/`SchemaWrite` traits.
13#[derive(Debug)]
14#[must_use]
15pub struct Builder<B>
16where
17    B: RwBuilder,
18{
19    /// The inner builder it wraps
20    builder: B,
21}
22
23impl<B> Builder<B>
24where
25    B: RwBuilder,
26{
27    /// Factory function to wrap an inner builder
28    pub const fn new(builder: B) -> Self {
29        Self { builder }
30    }
31
32    /// Load a value from the builder
33    ///
34    /// # Errors
35    /// Returns an error if deserialization or reading fails
36    pub fn load<T>(&self) -> Result<T>
37    where
38        T: for<'de> serde::de::Deserialize<'de>
39            + for<'de> wincode::SchemaRead<'de, wincode::config::DefaultConfig, Dst = T>,
40    {
41        let reader = self.builder.reader()?;
42        let adapter = ReadAdapter::new(reader);
43        let result = wincode::deserialize_from(adapter)?;
44        Ok(result)
45    }
46
47    /// Save a value to the builder
48    ///
49    /// # Errors
50    /// Returns an error if serialization or writing fails
51    pub fn save<T>(&self, value: &T) -> Result<()>
52    where
53        T: serde::ser::Serialize
54            + wincode::SchemaWrite<wincode::config::DefaultConfig, Src = T>
55            + ?Sized,
56    {
57        let writer = self.builder.writer()?;
58        let mut adapter = WriteAdapter::new(writer);
59        wincode::serialize_into(&mut adapter, value)?;
60        adapter.finish()?;
61        Ok(())
62    }
63}