use std::collections::HashMap;
use crate::error::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UpdateStrategy {
Overwrite,
}
impl Default for UpdateStrategy {
fn default() -> Self {
Self::Overwrite
}
}
#[derive(Default)]
pub struct PersistentState<ValueT, MetaDataT>
where
ValueT: Clone + Serialize + for<'de> Deserialize<'de>,
MetaDataT: Clone + Default + Serialize + for<'de> Deserialize<'de>,
{
pub data: HashMap<String, ValueT>,
pub metadata: MetaDataT,
}
#[async_trait::async_trait]
pub trait Persistence<ValueT, MetaDataT>: Send + Sync
where
ValueT: Clone + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
MetaDataT: Clone + Default + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
{
async fn init(&self) -> Result<()>;
async fn update(&self, state: PersistentState<ValueT, MetaDataT>) -> Result<()>;
async fn load(&self) -> Result<PersistentState<ValueT, MetaDataT>>;
async fn merge(&self, state: PersistentState<ValueT, MetaDataT>) -> Result<()> {
let mut self_state = self.load().await?;
self_state.data.extend(state.data);
self.update(self_state).await?;
Ok(())
}
async fn add_item(
&self,
key: &str,
value: ValueT,
strategy: Option<UpdateStrategy>,
) -> Result<()>;
async fn get_item(&self, key: &str) -> Result<ValueT>;
async fn remove_item(&self, key: &str) -> Result<()>;
async fn list_keys(&self) -> Result<Vec<String>>;
async fn list_items(&self) -> Result<Vec<ValueT>>;
}
pub trait Snapshot {
fn snapshot(&self, snapshot_id: &str) -> bool;
fn restore(&self, snapshot_id: &str) -> bool;
fn list(&self) -> Result<Vec<String>>;
fn cleanup(&self, older_than_days: u32) -> Result<()>;
}