db_rs/
single.rs

1use crate::errors::DbResult;
2use crate::logger::Logger;
3use crate::table::Table;
4use crate::TableId;
5use serde::de::DeserializeOwned;
6use serde::Serialize;
7
8/// A table which stores 0 or 1 values -- backed by [Option]
9#[derive(Debug)]
10#[cfg_attr(feature = "clone", derive(Clone))]
11pub struct Single<T>
12where
13    T: Serialize + DeserializeOwned,
14{
15    table_id: TableId,
16    inner: Option<T>,
17    pub logger: Logger,
18}
19
20impl<T> Table for Single<T>
21where
22    T: Serialize + DeserializeOwned,
23{
24    fn init(table_id: TableId, logger: Logger) -> Self {
25        Self { table_id, inner: None, logger }
26    }
27
28    fn handle_event(&mut self, bytes: &[u8]) -> DbResult<()> {
29        self.inner = bincode::deserialize(bytes)?;
30
31        Ok(())
32    }
33
34    fn compact_repr(&self) -> DbResult<Vec<u8>> {
35        if let Some(v) = &self.inner {
36            let data = bincode::serialize(&Some(v))?;
37            let data = Logger::log_entry(self.table_id, data);
38            Ok(data)
39        } else {
40            Ok(vec![])
41        }
42    }
43}
44
45impl<T> Single<T>
46where
47    T: Serialize + DeserializeOwned,
48{
49    pub fn insert(&mut self, value: T) -> DbResult<Option<T>> {
50        let log_entry = Some(&value);
51        let data = bincode::serialize(&log_entry)?;
52
53        let ret = self.inner.replace(value);
54
55        self.logger.write(self.table_id, data)?;
56
57        Ok(ret)
58    }
59
60    pub fn get(&self) -> Option<&T> {
61        self.inner.as_ref()
62    }
63
64    pub fn clear(&mut self) -> DbResult<Option<T>> {
65        let log_entry = Option::<T>::None;
66        let data = bincode::serialize(&log_entry)?;
67        let ret = self.inner.take();
68        self.logger.write(self.table_id, data)?;
69        Ok(ret)
70    }
71}