summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2018-04-16 10:32:52 +0200
committerMatthias Beyer <mail@beyermatthias.de>2018-04-16 10:53:23 +0200
commit8928f9cb9445d9fbdfae2612b399fc780faa50d2 (patch)
tree29e5e3a1b6763413f9cbaf249db0449884faf8ff /lib
parent5e51a77b3fb4c8adf5f05762047850cf26a98b8a (diff)
Automatically create "index" and link new pages
Diffstat (limited to 'lib')
-rw-r--r--lib/domain/libimagwiki/src/error.rs5
-rw-r--r--lib/domain/libimagwiki/src/store.rs5
-rw-r--r--lib/domain/libimagwiki/src/wiki.rs39
3 files changed, 42 insertions, 7 deletions
diff --git a/lib/domain/libimagwiki/src/error.rs b/lib/domain/libimagwiki/src/error.rs
index 0c922a6f..185f71f8 100644
--- a/lib/domain/libimagwiki/src/error.rs
+++ b/lib/domain/libimagwiki/src/error.rs
@@ -44,6 +44,11 @@ error_chain! {
description("Error while autolinking entry")
display("Error while autolinking entry: {}", sid)
}
+
+ MissingIndex {
+ description("Index page for wiki is missing")
+ display("Index page for wiki is missing")
+ }
}
}
diff --git a/lib/domain/libimagwiki/src/store.rs b/lib/domain/libimagwiki/src/store.rs
index d31b7369..2c0b8f51 100644
--- a/lib/domain/libimagwiki/src/store.rs
+++ b/lib/domain/libimagwiki/src/store.rs
@@ -68,7 +68,10 @@ impl WikiStore for Store {
debug!("Trying to create wiki '{}' with mainpage: '{:?}'", name, mainpagename);
let wiki = Wiki::new(self, name);
- wiki.create_entry(mainpagename.unwrap_or("main")).map(|_| wiki)
+ let _ = wiki.create_index_page()?;
+
+ wiki.create_entry(mainpagename.unwrap_or("main"))
+ .map(|_| wiki)
}
fn retrieve_wiki<'a, 'b>(&'a self, name: &'b str, mainpagename: Option<&str>)
diff --git a/lib/domain/libimagwiki/src/wiki.rs b/lib/domain/libimagwiki/src/wiki.rs
index f7e1aeca..acf4fd08 100644
--- a/lib/domain/libimagwiki/src/wiki.rs
+++ b/lib/domain/libimagwiki/src/wiki.rs
@@ -27,8 +27,10 @@ use libimagstore::store::FileLockEntry;
use libimagstore::storeid::IntoStoreId;
use libimagstore::storeid::StoreId;
use libimagstore::storeid::StoreIdIteratorWithStore;
+use libimagentrylink::internal::InternalLinker;
use error::WikiError as WE;
+use error::WikiErrorKind as WEK;
use error::Result;
pub struct Wiki<'a, 'b>(&'a Store, &'b str);
@@ -39,6 +41,15 @@ impl<'a, 'b> Wiki<'a, 'b> {
Wiki(store, name)
}
+ pub(crate) fn create_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
+ .create(sid)
+ .map_err(WE::from)
+ }
+
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 sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?;
@@ -46,15 +57,31 @@ impl<'a, 'b> Wiki<'a, 'b> {
}
pub fn create_entry<EN: AsRef<str>>(&self, entry_name: EN) -> Result<FileLockEntry<'a>> {
- let path = PathBuf::from(format!("{}/{}", self.1, entry_name.as_ref()));
- let sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?;
- self.0.create(sid).map_err(WE::from)
+ let path = PathBuf::from(format!("{}/{}", self.1, entry_name.as_ref()));
+ let sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?;
+ let mut index = self
+ .get_entry("index")?
+ .ok_or_else(|| WEK::MissingIndex.into())
+ .map_err(WE::from_kind)?;
+ let mut entry = self.0.create(sid)?;
+
+ entry.add_internal_link(&mut index)
+ .map_err(WE::from)
+ .map(|_| entry)
}
pub fn retrieve_entry<EN: AsRef<str>>(&self, entry_name: EN) -> Result<FileLockEntry<'a>> {
- let path = PathBuf::from(format!("{}/{}", self.1, entry_name.as_ref()));
- let sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?;
- self.0.retrieve(sid).map_err(WE::from)
+ let path = PathBuf::from(format!("{}/{}", self.1, entry_name.as_ref()));
+ let sid = ::module_path::ModuleEntryPath::new(path).into_storeid()?;
+ let mut index = self
+ .get_entry("index")?
+ .ok_or_else(|| WEK::MissingIndex.into())
+ .map_err(WE::from_kind)?;
+ let mut entry = self.0.retrieve(sid)?;
+
+ entry.add_internal_link(&mut index)
+ .map_err(WE::from)
+ .map(|_| entry)
}
pub fn all_ids(&self) -> Result<WikiIdIterator> {