bone_persistence/
factory.rs1use crate::error::Result;
2use crate::persistence::Persistence;
3use serde::{Deserialize, Serialize};
4use std::path::PathBuf;
5use std::sync::Arc;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub enum BackendType {
10 Sqlite,
11}
12
13#[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}