use std::marker::PhantomData;
use crate::codec::{decode_value, encode_value, KeyDecode, KeyEncode};
use crate::engine::{Readable, WriteTx};
use crate::error::StoreResult;
#[derive(Clone, Debug)]
pub struct Table<K, V> {
name: String,
_types: PhantomData<fn() -> (K, V)>,
}
impl<K, V> Table<K, V>
where
K: KeyEncode + KeyDecode,
V: serde::Serialize + serde::de::DeserializeOwned,
{
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
_types: PhantomData,
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn get(&self, tx: &impl Readable, key: &K) -> StoreResult<Option<V>> {
match tx.get_raw(&self.name, &key.encode())? {
Some(bytes) => Ok(Some(decode_value(&bytes)?)),
None => Ok(None),
}
}
pub fn put(&self, tx: &mut impl WriteTx, key: &K, value: &V) -> StoreResult<()> {
tx.put_raw(&self.name, &key.encode(), &encode_value(value)?)
}
pub fn delete(&self, tx: &mut impl WriteTx, key: &K) -> StoreResult<bool> {
tx.delete_raw(&self.name, &key.encode())
}
pub fn range(&self, tx: &impl Readable, lo: &K, hi: &K) -> StoreResult<Vec<(K, V)>> {
let raw = tx.range_raw(&self.name, &lo.encode(), &hi.encode())?;
raw.into_iter()
.map(|(k, v)| Ok((K::decode(&k)?, decode_value(&v)?)))
.collect()
}
}