Skip to main content

bone_persistence/
factory.rs

1use crate::error::Result;
2use crate::persistence::Persistence;
3use serde::{Deserialize, Serialize};
4use std::path::PathBuf;
5use std::sync::Arc;
6
7/// 后端类型
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub enum BackendType {
10    Sqlite,
11}
12
13/// 持久化配置
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct PersistenceConfig {
16    pub backend_type: BackendType,
17    pub location: PathBuf,
18    pub id: String,
19}
20
21impl Default for PersistenceConfig {
22    fn default() -> Self {
23        let data_dir = dirs::data_dir().unwrap();
24
25        Self {
26            backend_type: BackendType::Sqlite,
27            location: data_dir.join("bone-persistence"),
28            id: "default".to_string(),
29        }
30    }
31}
32
33pub struct PersistFactory;
34
35impl PersistFactory {
36    pub async fn create<ValueT, MetaDataT>(
37        config: PersistenceConfig,
38    ) -> Result<Arc<dyn Persistence<ValueT, MetaDataT>>>
39    where
40        ValueT: Clone + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
41        MetaDataT: Clone + Default + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
42    {
43        use crate::backends::sqlite::SqliteBackend;
44        match config.backend_type {
45            BackendType::Sqlite => {
46                let db_path = config.location.join(format!("{}.db", config.id));
47                let backend = SqliteBackend::new(&db_path).await?;
48                <SqliteBackend as Persistence<ValueT, MetaDataT>>::init(&backend).await?;
49                Ok(Arc::new(backend))
50            }
51        }
52    }
53
54    pub async fn create_default<ValueT, MetaDataT>()
55    -> Result<Arc<dyn Persistence<ValueT, MetaDataT>>>
56    where
57        ValueT: Clone + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
58        MetaDataT: Clone + Default + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static,
59    {
60        Self::create(PersistenceConfig::default()).await
61    }
62}