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}