summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2018-05-04 11:02:46 +0200
committerMatthias Beyer <mail@beyermatthias.de>2018-05-04 11:09:20 +0200
commit2e2bce77a08636d19625a58c02d266271d18c58f (patch)
treeec3876f050f9a693e019dc70a1542519b613f661 /lib
parent9c36fc8ac010e41af1cee51404265f034df4ca57 (diff)
Add functionality to remove categories
Diffstat (limited to 'lib')
-rw-r--r--lib/entry/libimagentrycategory/src/entry.rs18
-rw-r--r--lib/entry/libimagentrycategory/src/store.rs17
2 files changed, 35 insertions, 0 deletions
diff --git a/lib/entry/libimagentrycategory/src/entry.rs b/lib/entry/libimagentrycategory/src/entry.rs
index c6f82e04..624b5fa1 100644
--- a/lib/entry/libimagentrycategory/src/entry.rs
+++ b/lib/entry/libimagentrycategory/src/entry.rs
@@ -41,6 +41,8 @@ pub trait EntryCategory {
fn has_category(&self) -> Result<bool>;
+ fn remove_category(&mut self) -> Result<()>;
+
}
impl EntryCategory for Entry {
@@ -82,4 +84,20 @@ impl EntryCategory for Entry {
.map(|x| x.is_some())
}
+ /// Remove the category setting
+ ///
+ /// # Warning
+ ///
+ /// This does _only_ remove the category setting in the header. This does _not_ remove the
+ /// internal link to the category entry, nor does it remove the category from the store.
+ fn remove_category(&mut self) -> Result<()> {
+ use toml_query::delete::TomlValueDeleteExt;
+
+ self.get_header_mut()
+ .delete("category.value")
+ .chain_err(|| CEK::HeaderWriteError)
+ .map(|_| ())
+ }
+
+
}
diff --git a/lib/entry/libimagentrycategory/src/store.rs b/lib/entry/libimagentrycategory/src/store.rs
index 8179010d..1058c7bb 100644
--- a/lib/entry/libimagentrycategory/src/store.rs
+++ b/lib/entry/libimagentrycategory/src/store.rs
@@ -82,9 +82,26 @@ impl CategoryStore for Store {
}
/// Delete a category
+ ///
+ /// Automatically removes all category settings from entries which are linked to this category.
fn delete_category(&self, name: &str) -> Result<()> {
+ use libimagentrylink::internal::InternalLinker;
+ use category::Category;
+
trace!("Deleting category: '{}'", name);
let sid = mk_category_storeid(self.path().clone(), name)?;
+
+ {
+ let mut category = self.get(sid.clone())?
+ .ok_or_else(|| CEK::CategoryDoesNotExist)
+ .map_err(CE::from_kind)?;
+
+ for entry in category.get_entries(self)? {
+ let mut entry = entry?;
+ let _ = category.remove_internal_link(&mut entry)?;
+ }
+ }
+
self.delete(sid).map_err(CE::from)
}