1use crate::err;
2use std::ops::Deref;
3
4pub struct Tree {
6 inner: sled::Tree,
7}
8
9impl Deref for Tree {
10 type Target = sled::Tree;
11
12 fn deref(&self) -> &Self::Target {
13 &self.inner
14 }
15}
16
17impl Tree {
18 pub fn builder() -> TreeBuilder {
20 TreeBuilder::default()
21 }
22}
23
24#[derive(Default)]
26pub struct TreeBuilder {
27 tree_name: Option<String>,
28 db: Option<sled::Db>,
29}
30
31impl TreeBuilder {
32 pub(crate) fn merge(self, other: Self) -> Self {
33 let TreeBuilder { tree_name: a1, db: a2 } = self;
34 let TreeBuilder { tree_name: b1, db: b2 } = other;
35
36 TreeBuilder { tree_name: a1.or(b1), db: a2.or(b2) }
37 }
38
39 pub fn with_tree_name<I: Into<String>>(mut self, tree_name: I) -> Self {
41 self.tree_name = Some(tree_name.into());
42 self
43 }
44
45 pub fn with_db(mut self, db: sled::Db) -> Self {
47 self.db = Some(db);
48 self
49 }
50
51 pub fn finish(self) -> err::Result<Tree> {
53 let db = self.db.ok_or_else(|| err::custom("`db` not set"))?;
54 let tree_name = self.tree_name.ok_or_else(|| err::custom("`tree_name` not set"))?;
55
56 let inner = db.open_tree(tree_name.as_bytes())?;
57
58 Ok(Tree { inner })
59 }
60}