diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2018-04-16 10:32:52 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2018-04-16 10:53:23 +0200 |
commit | 8928f9cb9445d9fbdfae2612b399fc780faa50d2 (patch) | |
tree | 29e5e3a1b6763413f9cbaf249db0449884faf8ff /lib | |
parent | 5e51a77b3fb4c8adf5f05762047850cf26a98b8a (diff) |
Automatically create "index" and link new pages
Diffstat (limited to 'lib')
-rw-r--r-- | lib/domain/libimagwiki/src/error.rs | 5 | ||||
-rw-r--r-- | lib/domain/libimagwiki/src/store.rs | 5 | ||||
-rw-r--r-- | lib/domain/libimagwiki/src/wiki.rs | 39 |
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> { |