use std::fmt::Debug;
use serde::{de::DeserializeOwned, Serialize};
use super::{
error::{InnerKvError::*, InnerKvResult},
helpers::{deserialize, serialize},
types::{KeyReservation, DEFAULT_RESERVE},
};
use crate::encrypted_sled;
pub(super) fn handle_reserve(
kv: &encrypted_sled::Db,
key: String,
) -> InnerKvResult<KeyReservation> {
if kv.contains_key(&key)? {
return Err(LogicalErr(format!("kv_manager key <{key}> already reserved.")));
}
kv.insert(&key, DEFAULT_RESERVE)?;
Ok(KeyReservation { key })
}
pub(super) fn handle_delete(kv: &encrypted_sled::Db, key: String) -> InnerKvResult<()> {
if !kv.contains_key(&key)? {
return Ok(());
}
if kv.get(&key)? == Some(sled::IVec::from(DEFAULT_RESERVE)) {
return Err(LogicalErr(format!("can't delete reserved key <{key}> in kv store.")));
}
kv.remove(&key)?;
Ok(())
}
pub(super) fn handle_put<V>(
kv: &encrypted_sled::Db,
reservation: KeyReservation,
value: V,
) -> InnerKvResult<()>
where
V: Serialize,
{
if kv.get(&reservation.key)? != Some(sled::IVec::from(DEFAULT_RESERVE)) {
return Err(LogicalErr(format!(
"did not find reservation for key <{}> in kv store.",
reservation.key
)));
}
let bytes = serialize(&value).map_err(|_| SerializationErr)?;
kv.insert(&reservation.key, bytes)?;
Ok(())
}
pub(super) fn handle_get<V>(kv: &encrypted_sled::Db, key: String) -> InnerKvResult<V>
where
V: DeserializeOwned + Debug,
{
let value = match kv.get(&key)? {
Some(bytes) => deserialize(&bytes).ok_or(DeserializationErr)?,
None => return Err(LogicalErr(format!("key <{key}> does not have a value."))),
};
Ok(value)
}
pub(super) fn handle_exists(kv: &encrypted_sled::Db, key: &str) -> InnerKvResult<bool> {
kv.contains_key(key).map_err(|err| {
LogicalErr(format!("Could not perform 'contains_key' for key <{key}> due to error: {err}"))
})
}