bone-persistence 0.1.0

Persistence layer for BoneTools
Documentation
use std::collections::HashMap;

use crate::error::Result;
use serde::{Deserialize, Serialize};

/// 更新策略
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UpdateStrategy {
    /// 覆盖现有状态
    Overwrite,
    // TODO: 未来可以添加更多策略,如 Merge, Append 等
}

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,
}

/// 持久化抽象 trait
/// 定义了状态持久化的核心接口,支持多状态管理
#[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?;
        // TODO: 增加遇到相同的 key 的处理逻辑
        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<()>;
}