Skip to main content

elemental_shared/
store.rs

1use crate::{
2    loader::Loader,
3    version::{Migrator, Persistor, VersionControlled},
4};
5use anyhow::Result;
6use serde::{Deserialize, Serialize};
7
8#[derive(Serialize, Deserialize, Default)]
9pub struct Store<V> {
10    pub value: V,
11    pub version: usize,
12}
13
14impl<T: Default> VersionControlled for Store<T> {
15    #[inline(always)]
16    fn version(&self) -> usize {
17        self.version
18    }
19}
20
21pub type StoreLoader<M, V, P> = Loader<M, Store<V>, P>;
22
23impl<V: Default> Store<V> {
24    pub async fn load<M: Migrator<Store<V>>, P: Persistor<Store<V>>>(
25        migrator: M,
26        persistor: P,
27        version: usize,
28    ) -> Result<StoreLoader<M, V, P>> {
29        StoreLoader::load(migrator, persistor, version).await
30    }
31}
32
33impl<V: Clone> Clone for Store<V> {
34    fn clone(&self) -> Self {
35        Self {
36            value: self.value.clone(),
37            version: self.version,
38        }
39    }
40}