#![deny(missing_docs)]
#![doc = include_str!("../README.md")]
mod store;
use std::path::Path;
use store::Store;
mod table;
#[cfg(test)]
mod tests;
pub use table::{Table, TableMut, TableReadInterface, TableWriteInterface};
use anyhow::Result;
use serde::{de::DeserializeOwned, Serialize};
const MAIN_TABLE: &str = "#_#_main_dbless_table_#_#";
pub struct Database {
store: Store,
}
impl Database {
pub fn open(path: impl AsRef<Path>) -> Result<Self> {
Ok(Database {
store: Store::file(path)?,
})
}
pub fn in_memory() -> Result<Self> {
Ok(Database {
store: Store::in_memory()?,
})
}
pub fn close(self) {
drop(self);
}
pub fn table<'a>(&'a self, name: &'a str) -> Table<'a> {
Table {
store: &self.store,
name,
}
}
pub fn table_mut<'a>(&'a mut self, name: &'a str) -> TableMut<'a> {
TableMut {
store: &mut self.store,
name,
}
}
pub fn list_tables(&self) -> Result<Vec<String>> {
Ok(self
.store
.list_tables()?
.into_iter()
.filter(|t| t != MAIN_TABLE)
.collect())
}
pub fn delete_table(&mut self, name: &str) -> Result<()> {
self.store.delete_table(name)
}
pub fn len_all_tables(&self) -> Result<usize> {
self.store.len_all_tables()
}
pub fn size_all_tables(&self) -> Result<usize> {
self.len_all_tables()
}
pub fn delete_all_tables(&mut self) -> Result<()> {
self.store.delete_all_tables()
}
}
macro_rules! mirror_methods_with {
{self.$fn:ident($arg:expr); $(fn $name:ident$(<$($gname:ident: $gty1:ident $(+$gtyr:ident)*),+>)?(&self $(,$pname:ident: $pty:ty)*) -> $ret:ty;)*} => {
$(
fn $name$(<$($gname: $gty1$(+$gtyr)*),+>)?(&self, $($pname: $pty),*) -> $ret {
self.$fn($arg).$name($($pname),*)
}
)*
}
}
macro_rules! mirror_methods_mut_with {
{self.$fn:ident($arg:expr); $(fn $name:ident$(<$($gname:ident: $gty1:ident $(+$gtyr:ident)*),+>)?(&mut self $(,$pname:ident: $pty:ty)*) -> $ret:ty;)*} => {
$(
fn $name$(<$($gname: $gty1$(+$gtyr)*),+>)?(&mut self, $($pname: $pty),*) -> $ret {
self.$fn($arg).$name($($pname),*)
}
)*
}
}
impl TableReadInterface for Database {
mirror_methods_with! {
self.table(MAIN_TABLE);
fn get<T: DeserializeOwned>(&self, key: &str) -> Result<Option<T>>;
fn keys(&self) -> Result<Vec<String>> ;
fn values<T: DeserializeOwned>(&self) -> Result<Vec<T>> ;
fn entries<T: DeserializeOwned>(&self) -> Result<Vec<(String, T)>> ;
fn len(&self) -> Result<usize> ;
fn is_empty(&self) -> Result<bool> ;
fn contains_key(&self, key: &str) -> Result<bool> ;
fn size(&self) -> Result<usize> ;
fn contains(&self, key: &str) -> Result<bool> ;
fn has(&self, key: &str) -> Result<bool> ;
fn get_or<T: DeserializeOwned>(&self, key: &str, default: T) -> Result<T> ;
fn get_or_default<T: DeserializeOwned + Default>(&self, key: &str) -> Result<T> ;
}
fn get_or_else<T: DeserializeOwned, F: FnOnce() -> T>(
&self,
key: &str,
default: F,
) -> Result<T> {
self.table(MAIN_TABLE).get_or_else(key, default)
}
}
impl TableWriteInterface for Database {
mirror_methods_mut_with! {
self.table_mut(MAIN_TABLE);
fn insert<T: Serialize>(&mut self, key: &str, value: &T) -> Result<()>;
fn remove(&mut self, key: &str) -> Result<()>;
fn clear(&mut self) -> Result<()>;
fn set<T: Serialize>(&mut self, key: &str, value: &T) -> Result<()>;
fn delete(&mut self, key: &str) -> Result<()>;
fn reset(&mut self) -> Result<()>;
fn get_or_insert<T: Serialize + DeserializeOwned>(&mut self, key: &str, default: T) -> Result<T>;
fn get_or_insert_default<T: Serialize + DeserializeOwned + Default>(&mut self, key: &str) -> Result<T>;
}
fn get_or_insert_with<T: Serialize + DeserializeOwned, F: FnOnce() -> T>(
&mut self,
key: &str,
default: F,
) -> Result<T> {
self.table_mut(MAIN_TABLE).get_or_insert_with(key, default)
}
}