mdbook_journal/journal/persistence/traits/
persistence.rs

1use crate::prelude::*;
2
3#[derive(Debug)]
4pub enum Query<'a> {
5    /// Find all for a provided topic name
6    ForTopic(&'a Topic),
7    /// Fetch all entries
8    AllEntries,
9}
10
11pub trait PersistenceTrait {
12    type Serialized;
13
14    fn persist(&self, path: &Path, data: &Self::Serialized) -> Result<()>;
15
16    fn load(&self, path: &Path) -> Result<(PathBuf, Self::Serialized)>;
17
18    fn serialize(&self, entry: &Entry) -> Result<Self::Serialized>;
19
20    fn deserialize(&self, data: Self::Serialized) -> Result<Entry>;
21
22    fn execute(&self, query: &Query) -> Result<Vec<(PathBuf, Self::Serialized)>>;
23
24    fn fetch(&self, path: &Path) -> Result<Entry> {
25        let (file_path, data) = self.load(path)?;
26        let mut entry = self.deserialize(data)?;
27        entry.file_loc = Some(file_path);
28        Ok(entry)
29    }
30
31    fn query(&self, query: &Query) -> Result<Vec<Entry>> {
32        self.execute(query)?
33            .into_iter()
34            .try_fold(vec![], |mut items, (path, data)| {
35                let mut entry = self.deserialize(data)?;
36                entry.file_loc = Some(path);
37                items.push(entry);
38                Ok(items)
39            })
40    }
41}