Skip to main content

pallet/
db.rs

1use crate::err;
2use std::ops::Deref;
3
4/// Wrapper for `sled::Tree` and its `sled::Db` (included for `id` generation)
5pub 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    /// Create a new builder
19    pub fn builder() -> TreeBuilder {
20        TreeBuilder::default()
21    }
22}
23
24/// Builder for `Tree`
25#[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    /// Set the name for this `Tree`
40    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    /// Set the `sled::Db` for this `Tree`
46    pub fn with_db(mut self, db: sled::Db) -> Self {
47        self.db = Some(db);
48        self
49    }
50
51    /// Convert into finished `Tree`
52    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}