toboggan_kv/
lib.rs

1//! Toboggan - sled flavored KV abstraction
2//! ```
3//! # use toboggan_kv::{Toboggan,Tree,adapter::{BTreeAdapter, SledAdapter}};
4//! let bta = BTreeAdapter::new();
5//! braap(bta);
6//!
7//! let tmpdir = tempfile::tempdir().unwrap();
8//! let sa = SledAdapter::open(tmpdir.path()).unwrap();
9//! braap(sa);
10//!
11//! fn braap<T:Toboggan>( store: T ){
12//!     let beasts = store.open_tree("beasts").unwrap();
13//!     beasts.insert("meow", "cat").unwrap();
14//! }
15//! ```
16//!
17
18pub mod adapter;
19pub mod error;
20
21#[cfg(test)]
22pub mod tester;
23
24pub use error::Error;
25use std::fmt::Debug;
26
27pub trait Toboggan: Clone {
28    type Tree: self::Tree;
29    fn open_tree<V: AsRef<[u8]>>(&self, name: V) -> Result<Self::Tree, Error>;
30}
31pub trait MergeOperator: Fn(&[u8], Option<&[u8]>, &[u8]) -> Option<Vec<u8>> {}
32impl<F> MergeOperator for F where F: Fn(&[u8], Option<&[u8]>, &[u8]) -> Option<Vec<u8>> {}
33
34pub trait Tree {
35    type OutValue: AsRef<[u8]>
36        + std::borrow::Borrow<[u8]>
37        + PartialEq<Vec<u8>>
38        + std::ops::Deref<Target = [u8]>
39        + Debug;
40    type Iter: Iterator<Item = Result<(Self::OutValue, Self::OutValue), Error>>;
41
42    fn insert<K: AsRef<[u8]> + Into<Vec<u8>>, V: AsRef<[u8]>>(
43        &self,
44        key: K,
45        value: V,
46    ) -> Result<(), Error>;
47    fn set_merge_operator(&self, merge_operator: impl MergeOperator + 'static);
48    fn merge<K: AsRef<[u8]>, V: AsRef<[u8]>>(&self, key: K, value: V) -> Result<(), Error>;
49    fn get<K: AsRef<[u8]>>(&self, key: K) -> Result<Option<Self::OutValue>, Error>;
50    fn iter(&self) -> Self::Iter;
51    fn flush(&self) -> Result<(), Error>;
52    fn clear(&self) -> Result<(), Error>;
53}