summaryrefslogtreecommitdiff
path: root/shared/src/store.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-07 22:56:34 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-07 22:56:34 +0100
commit02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3 (patch)
tree10362c18bccf2e9690d78844a7ff3ca403f7a126 /shared/src/store.rs
parent745c0ff9cfb27381114ce832baed3b57a2e4b4f6 (diff)
downloadweareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar
weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.bz2
weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.zst
static typing for resources
Diffstat (limited to 'shared/src/store.rs')
-rw-r--r--shared/src/store.rs18
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()?;