1use crate::errors::DbResult;
2use crate::logger::Logger;
3use crate::table::Table;
4use crate::TableId;
5use serde::de::DeserializeOwned;
6use serde::Serialize;
7
8#[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}