Change WikiStore::create_wiki() interface

to also return the index page. This way a user of the library can use
the index page entry right away.

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
This commit is contained in:
Matthias Beyer 2018-10-17 14:43:21 +02:00
parent 860c58cbdf
commit 029a3c448e
2 changed files with 22 additions and 7 deletions

View file

@ -17,6 +17,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// //
use libimagstore::store::FileLockEntry;
use libimagstore::store::Store; use libimagstore::store::Store;
use libimagstore::storeid::StoreId; use libimagstore::storeid::StoreId;
use libimagstore::storeid::IntoStoreId; use libimagstore::storeid::IntoStoreId;
@ -30,10 +31,10 @@ pub trait WikiStore {
fn get_wiki<'a, 'b>(&'a self, name: &'b str) -> Result<Option<Wiki<'a, 'b>>>; 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) fn create_wiki<'a, 'b>(&'a self, name: &'b str)
-> Result<Wiki<'a, 'b>>; -> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)>;
fn retrieve_wiki<'a, 'b>(&'a self, name: &'b str) fn retrieve_wiki<'a, 'b>(&'a self, name: &'b str)
-> Result<Wiki<'a, 'b>>; -> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)>;
} }
@ -59,20 +60,23 @@ impl WikiStore for Store {
/// Ob success, an empty Wiki entry with the name `index` is created inside the wiki. Later, new /// Ob success, an empty Wiki entry with the name `index` is created inside the wiki. Later, new
/// entries are automatically linked to this entry. /// entries are automatically linked to this entry.
/// ///
fn create_wiki<'a, 'b>(&'a self, name: &'b str) -> Result<Wiki<'a, 'b>> { fn create_wiki<'a, 'b>(&'a self, name: &'b str) -> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)> {
debug!("Trying to get wiki '{}'", name); debug!("Trying to get wiki '{}'", name);
let wiki = Wiki::new(self, name); let wiki = Wiki::new(self, name);
let _ = wiki.create_index_page()?; let index = wiki.create_index_page()?;
Ok(wiki) Ok((wiki, index))
} }
fn retrieve_wiki<'a, 'b>(&'a self, name: &'b str) fn retrieve_wiki<'a, 'b>(&'a self, name: &'b str)
-> Result<Wiki<'a, 'b>> -> Result<(Wiki<'a, 'b>, FileLockEntry<'a>)>
{ {
match self.get_wiki(name)? { match self.get_wiki(name)? {
None => self.create_wiki(name), None => self.create_wiki(name),
Some(wiki) => Ok(wiki), Some(wiki) => {
let index = wiki.get_index_page()?;
Ok((wiki, index))
},
} }
} }

View file

@ -30,6 +30,7 @@ use libimagstore::storeid::StoreIdIteratorWithStore;
use libimagentrylink::internal::InternalLinker; use libimagentrylink::internal::InternalLinker;
use failure::Fallible as Result; use failure::Fallible as Result;
use failure::Error;
use failure::err_msg; use failure::err_msg;
pub struct Wiki<'a, 'b>(&'a Store, &'b str); pub struct Wiki<'a, 'b>(&'a Store, &'b str);
@ -56,6 +57,16 @@ impl<'a, 'b> Wiki<'a, 'b> {
self.0.create(sid) self.0.create(sid)
} }
pub(crate) fn get_index_page(&self) -> Result<FileLockEntry<'a>> {
let path = PathBuf::from(format!("{}/index", self.1));
let sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?;
self.0
.get(sid)
.map_err(Error::from)?
.ok_or_else(|| Error::from(err_msg("Missing index")))
}
pub fn get_entry<EN: AsRef<str>>(&self, entry_name: EN) -> Result<Option<FileLockEntry<'a>>> { pub fn get_entry<EN: AsRef<str>>(&self, entry_name: EN) -> Result<Option<FileLockEntry<'a>>> {
let path = PathBuf::from(format!("{}/{}", self.1, entry_name.as_ref())); let path = PathBuf::from(format!("{}/{}", self.1, entry_name.as_ref()));
let sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?; let sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?;