elemental_shared/
store.rs1use 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}