bone_persistence/
persistence.rs1use std::collections::HashMap;
2
3use crate::error::Result;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum UpdateStrategy {
9 Overwrite,
11 }
13
14impl Default for UpdateStrategy {
15 fn default() -> Self {
16 Self::Overwrite
17 }
18}
19
20#[derive(Default)]
21pub struct PersistentState<ValueT, MetaDataT>
22where
23 ValueT: Clone + Serialize + for<'de> Deserialize<'de>,
24 MetaDataT: Clone + Default + Serialize + for<'de> Deserialize<'de>,
25{
26 pub data: HashMap<String, ValueT>,
27 pub metadata: MetaDataT,
28}
29
30#[async_trait::async_trait]
33pub trait Persistence<ValueT, MetaDataT>: Send + Sync
34where
35 ValueT: Clone + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
36 MetaDataT: Clone + Default + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
37{
38 async fn init(&self) -> Result<()>;
40
41 async fn update(&self, state: PersistentState<ValueT, MetaDataT>) -> Result<()>;
43
44 async fn load(&self) -> Result<PersistentState<ValueT, MetaDataT>>;
46
47 async fn merge(&self, state: PersistentState<ValueT, MetaDataT>) -> Result<()> {
49 let mut self_state = self.load().await?;
50 self_state.data.extend(state.data);
51 self.update(self_state).await?;
52 Ok(())
54 }
55
56 async fn add_item(
58 &self,
59 key: &str,
60 value: ValueT,
61 strategy: Option<UpdateStrategy>,
62 ) -> Result<()>;
63
64 async fn get_item(&self, key: &str) -> Result<ValueT>;
66
67 async fn remove_item(&self, key: &str) -> Result<()>;
69
70 async fn list_keys(&self) -> Result<Vec<String>>;
72
73 async fn list_items(&self) -> Result<Vec<ValueT>>;
75}
76
77pub trait Snapshot {
78 fn snapshot(&self, snapshot_id: &str) -> bool;
80
81 fn restore(&self, snapshot_id: &str) -> bool;
83
84 fn list(&self) -> Result<Vec<String>>;
86
87 fn cleanup(&self, older_than_days: u32) -> Result<()>;
89}