sled_tables/
lib.rs

1pub mod tables;
2pub mod error;
3pub use sled;
4
5#[cfg(test)]
6mod tests {
7    use serde::{Serialize, Deserialize};
8
9    #[derive(Serialize, Deserialize, PartialEq, Debug)]
10    struct Data {
11        name: String,
12        inner: Vec<String>
13    }
14
15    struct DataDb {
16        pub names: super::tables::SledEventTree<String>,
17        pub values: super::tables::SledEventTreeVec<String>,
18    }
19
20    impl DataDb {
21        fn new<'p, P>(path: P) -> Result<Self, super::error::Error>
22            where P: Into<&'p std::path::Path>{
23            let db = sled::open(path.into())?;
24            Ok(Self {
25                names: super::tables::SledEventTree::new(db.open_tree(b"names")?),
26                values: super::tables::SledEventTreeVec::new(db.open_tree(b"values")?),
27            })
28        }
29    }
30
31    impl Data {
32        fn save_rewrite(&self, db: &DataDb) -> Result<(), super::error::Error> {
33            db.values.put(db.names.designated_key(&self.name), self.inner.clone())
34        }
35        
36        fn restore(name: &str, db: &DataDb) -> Result<Self, super::error::Error> {
37            if let Ok(Some(inner)) = db.values.get(db.names.designated_key(&name.into())) {
38                Ok(Data {
39                    name: name.into(),
40                    inner
41                })
42            } else {
43                Err(super::error::Error::NoDataError)
44            }
45        }
46    }
47
48    #[test]
49    fn save_and_restore() {
50        let data = Data {
51            name: "first".into(),
52            inner: vec!("a".into(), "b".into(), "c".into())
53        };
54
55        let tmp = tempfile::Builder::new().prefix("test-db").tempdir().unwrap();
56        std::fs::create_dir_all(tmp.path()).unwrap();
57
58        let db = DataDb::new(tmp.path());
59        assert!(db.is_ok());
60        let db = db.unwrap();
61
62        assert!(data.save_rewrite(&db).is_ok());
63
64        let restored = Data::restore("first", &db);
65        assert!(restored.is_ok());
66
67        assert_eq!(data, restored.unwrap());
68    }
69}