use crate::{Location, StoreImpl};
use serde::{de::DeserializeOwned, Serialize};
#[derive(Debug)]
pub struct SledStore {
db: sled::Db,
}
pub use SledStore as InnerStore;
#[derive(thiserror::Error, Debug)]
pub enum GetError {
#[error("Sled error")]
Sled(#[from] sled::Error),
#[error("MessagePack deserialization error")]
MessagePack(#[from] rmp_serde::decode::Error),
#[error("No value found for the given key")]
NotFound,
}
#[derive(thiserror::Error, Debug)]
pub enum SetError {
#[error("Sled error")]
Sled(#[from] sled::Error),
#[error("MessagePack serialization error")]
MessagePack(#[from] rmp_serde::encode::Error),
}
#[derive(thiserror::Error, Debug)]
pub enum RemoveError {
#[error("Sled error")]
Sled(#[from] sled::Error),
#[error("MessagePack deserialization error")]
MessagePack(#[from] rmp_serde::decode::Error),
#[error("No value found for the given key")]
NotFound,
}
impl SledStore {
pub(crate) fn new(location: Location) -> Self {
let db_path = location.get_path().join("bevy_pkv.sled");
let db = sled::open(db_path).expect("Failed to init key value store");
Self { db }
}
pub(crate) fn new_with_filename(location: Location, filename: &str) -> Self {
let db_path = location.get_path().join(filename);
let db = sled::open(db_path).expect("Failed to init key value store");
Self { db }
}
}
impl StoreImpl for SledStore {
type GetError = GetError;
type SetError = SetError;
type RemoveError = RemoveError;
fn set<T: Serialize>(&mut self, key: &str, value: &T) -> Result<(), Self::SetError> {
let mut serializer = rmp_serde::Serializer::new(Vec::new()).with_struct_map();
value.serialize(&mut serializer)?;
self.db.insert(key, serializer.into_inner())?;
self.db.flush()?;
Ok(())
}
fn set_string(&mut self, key: &str, value: &str) -> Result<(), Self::SetError> {
let bytes = rmp_serde::to_vec(value)?;
self.db.insert(key, bytes)?;
self.db.flush()?;
Ok(())
}
fn get<T: DeserializeOwned>(&self, key: &str) -> Result<T, Self::GetError> {
let bytes = self.db.get(key)?.ok_or(Self::GetError::NotFound)?;
let value = rmp_serde::from_slice(&bytes)?;
Ok(value)
}
fn clear(&mut self) -> Result<(), Self::SetError> {
self.db.clear()?;
self.db.flush()?;
Ok(())
}
fn remove(&mut self, key: &str) -> Result<(), Self::RemoveError> {
self.db.remove(key)?;
Ok(())
}
fn remove_and_get<T: DeserializeOwned>(
&mut self,
key: &str,
) -> Result<Option<T>, Self::RemoveError> {
let bytes = self.db.remove(key)?.ok_or(Self::RemoveError::NotFound)?;
let value = rmp_serde::from_slice(&bytes)?;
Ok(value)
}
}