diff options
Diffstat (limited to 'shared/src/store.rs')
-rw-r--r-- | shared/src/store.rs | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/shared/src/store.rs b/shared/src/store.rs index 38402fc..f63ed6c 100644 --- a/shared/src/store.rs +++ b/shared/src/store.rs @@ -14,11 +14,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ -use crate::packets::Resource; +use crate::packets::{ReadWrite, Resource}; use anyhow::Result; use redb::{Database, TableDefinition}; use sha2::{Digest, Sha256}; -use std::{collections::HashMap, path::Path, sync::Mutex}; +use std::{collections::HashMap, marker::PhantomData, path::Path, sync::Mutex}; const T_ENTRIES: TableDefinition<[u8; 32], &[u8]> = TableDefinition::new("e"); @@ -33,7 +33,15 @@ impl ResourceStore { pub fn new_memory() -> Self { Self::Memory(HashMap::new().into()) } - pub fn get(&self, key: Resource) -> Result<Option<Vec<u8>>> { + pub fn get<T: ReadWrite>(&self, key: Resource<T>) -> Result<Option<T>> { + self.get_raw(Resource(key.0, PhantomData))? + .map(|b| T::read(&mut b.as_slice())) + .transpose() + } + pub fn set<T: ReadWrite>(&self, value: &T) -> Result<Resource<T>> { + Ok(Resource(self.set_raw(&value.write_alloc())?.0, PhantomData)) + } + pub fn get_raw(&self, key: Resource) -> Result<Option<Vec<u8>>> { match self { ResourceStore::Redb(database) => { let txn = database.begin_read()?; @@ -46,8 +54,8 @@ impl ResourceStore { ResourceStore::Memory(map) => Ok(map.lock().unwrap().get(&key).map(|x| x.to_vec())), } } - pub fn set(&self, value: &[u8]) -> Result<Resource> { - let key = Resource(sha256(value)); + pub fn set_raw(&self, value: &[u8]) -> Result<Resource> { + let key = Resource(sha256(value), PhantomData); match self { ResourceStore::Redb(database) => { let txn = database.begin_write()?; |