Skip to main content

bone_persistence/
persistence.rs

1use std::collections::HashMap;
2
3use crate::error::Result;
4use serde::{Deserialize, Serialize};
5
6/// 更新策略
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum UpdateStrategy {
9    /// 覆盖现有状态
10    Overwrite,
11    // TODO: 未来可以添加更多策略,如 Merge, Append 等
12}
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/// 持久化抽象 trait
31/// 定义了状态持久化的核心接口,支持多状态管理
32#[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    /// 初始化
39    async fn init(&self) -> Result<()>;
40
41    /// 更新状态
42    async fn update(&self, state: PersistentState<ValueT, MetaDataT>) -> Result<()>;
43
44    /// 加载状态
45    async fn load(&self) -> Result<PersistentState<ValueT, MetaDataT>>;
46
47    /// 合并状态
48    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        // TODO: 增加遇到相同的 key 的处理逻辑
53        Ok(())
54    }
55
56    /// 添加新数据项
57    async fn add_item(
58        &self,
59        key: &str,
60        value: ValueT,
61        strategy: Option<UpdateStrategy>,
62    ) -> Result<()>;
63
64    /// 加载指定数据项
65    async fn get_item(&self, key: &str) -> Result<ValueT>;
66
67    /// 删除数据项
68    async fn remove_item(&self, key: &str) -> Result<()>;
69
70    /// 列出所有数据项键
71    async fn list_keys(&self) -> Result<Vec<String>>;
72
73    /// 列出所有数据项
74    async fn list_items(&self) -> Result<Vec<ValueT>>;
75}
76
77pub trait Snapshot {
78    /// 创建状态快照
79    fn snapshot(&self, snapshot_id: &str) -> bool;
80
81    /// 从快照恢复状态
82    fn restore(&self, snapshot_id: &str) -> bool;
83
84    /// 列出所有快照
85    fn list(&self) -> Result<Vec<String>>;
86
87    /// 清理过期数据
88    fn cleanup(&self, older_than_days: u32) -> Result<()>;
89}