sos_backend/
preferences.rs

1use crate::{BackendTarget, Error};
2use async_trait::async_trait;
3use sos_core::{AccountId, PublicIdentity};
4use sos_database::PreferenceProvider as DbPreferenceProvider;
5use sos_filesystem::PreferenceProvider as FsPreferenceProvider;
6use sos_preferences::{
7    CachedPreferences, PreferenceManager, PreferenceStorageProvider,
8    Preferences,
9};
10use std::sync::Arc;
11use tokio::sync::Mutex;
12
13/// Backend preferences.
14pub struct BackendPreferences(CachedPreferences<Error>);
15
16impl BackendPreferences {
17    /// Create new preferences.
18    pub fn new(target: BackendTarget) -> Self {
19        match target {
20            BackendTarget::FileSystem(paths) => {
21                let provider: PreferenceStorageProvider<Error> =
22                    Box::new(FsPreferenceProvider::new(paths));
23                Self(CachedPreferences::new(Arc::new(provider)))
24            }
25            BackendTarget::Database(_, client) => {
26                let provider: PreferenceStorageProvider<Error> =
27                    Box::new(DbPreferenceProvider::new(client));
28                Self(CachedPreferences::new(Arc::new(provider)))
29            }
30        }
31    }
32}
33
34#[async_trait]
35impl PreferenceManager for BackendPreferences {
36    type Error = Error;
37
38    async fn load_global_preferences(&mut self) -> Result<(), Self::Error> {
39        self.0.load_global_preferences().await
40    }
41
42    async fn load_account_preferences(
43        &self,
44        accounts: &[PublicIdentity],
45    ) -> Result<(), Self::Error> {
46        self.0.load_account_preferences(accounts).await
47    }
48
49    fn global_preferences(&self) -> Arc<Mutex<Preferences<Self::Error>>> {
50        self.0.global_preferences()
51    }
52
53    async fn account_preferences(
54        &self,
55        account_id: &AccountId,
56    ) -> Option<Arc<Mutex<Preferences<Self::Error>>>> {
57        self.0.account_preferences(account_id).await
58    }
59
60    async fn new_account(
61        &self,
62        account_id: &AccountId,
63    ) -> Result<(), Self::Error> {
64        self.0.new_account(account_id).await
65    }
66}