use libimagstore::store::FileLockEntry;
use libimagstore::store::Store;
use libimagstore::storeid::StoreId;
use failure::Fallible as Result;
use crate::wiki::Wiki;
pub trait WikiStore {
fn get_wiki<'a, 'b>(&'a self, name: &'b str) -> Result<Option<Wiki<'a, 'b>>>;
fn create_wiki<'a, 'b>(&'a self, name: &'b str)
-> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)>;
fn retrieve_wiki<'a, 'b>(&'a self, name: &'b str)
-> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)>;
}
impl WikiStore for Store {
fn get_wiki<'a, 'b>(&'a self, name: &'b str) -> Result<Option<Wiki<'a, 'b>>> {
if self.exists(wiki_path(name)?)? {
debug!("Building Wiki object");
Ok(Some(Wiki::new(self, name)))
} else {
debug!("Cannot build wiki object: Wiki does not exist");
Ok(None)
}
}
fn create_wiki<'a, 'b>(&'a self, name: &'b str) -> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)> {
debug!("Trying to get wiki '{}'", name);
let wiki = Wiki::new(self, name);
let index = wiki.create_index_page()?;
Ok((wiki, index))
}
fn retrieve_wiki<'a, 'b>(&'a self, name: &'b str)
-> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)>
{
match self.get_wiki(name)? {
None => self.create_wiki(name),
Some(wiki) => {
let index = wiki.get_index_page()?;
Ok((wiki, index))
},
}
}
}
fn wiki_path(name: &str) -> Result<StoreId> {
crate::module_path::new_id(name)
}