summaryrefslogtreecommitdiffstats
path: root/libimagtag
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2016-02-14 20:09:51 +0100
committerMatthias Beyer <mail@beyermatthias.de>2016-02-14 20:15:36 +0100
commita2898dcc467bcaf1097b40b168056f865637c009 (patch)
tree8a5a4056333909cac584a8ab91dd79b0fe9cb231 /libimagtag
parentf4e7969039cb86cc0e1787fe6dc1d5f969334b09 (diff)
Implement: remove::remove_tag()
Diffstat (limited to 'libimagtag')
-rw-r--r--libimagtag/src/remove.rs46
1 files changed, 44 insertions, 2 deletions
diff --git a/libimagtag/src/remove.rs b/libimagtag/src/remove.rs
index 9aef862d..084cee93 100644
--- a/libimagtag/src/remove.rs
+++ b/libimagtag/src/remove.rs
@@ -1,9 +1,51 @@
+use toml::Value;
use libimagstore::store::Entry;
use result::Result;
use tag::Tag;
+use error::{TagError, TagErrorKind};
-pub fn remove_tag(e: &Entry, t: &Tag) -> Result<()> {
- unimplemented!()
+pub fn remove_tag(e: &mut Entry, t: &Tag) -> Result<()> {
+ let tags = e.get_header().read("imag.tags");
+ if tags.is_err() {
+ let kind = TagErrorKind::HeaderReadError;
+ return Err(TagError::new(kind, Some(Box::new(tags.err().unwrap()))));
+ }
+ let tags = tags.unwrap();
+
+ if !tags.iter().all(|t| match t { &Value::String(_) => true, _ => false }) {
+ return Err(TagError::new(TagErrorKind::TagTypeError, None));
+ }
+
+ if tags.is_none() {
+ return Ok(());
+ }
+ let tags = tags.unwrap();
+
+ if !match tags { Value::Array(_) => true, _ => false } {
+ return Err(TagError::new(TagErrorKind::TagTypeError, None));
+ }
+
+ match tags {
+ Value::Array(tag_array) => {
+ let new_tags = tag_array.iter()
+ .map(|tag| {
+ match tag {
+ &Value::String(ref s) => s,
+ _ => unreachable!(),
+ }
+ })
+ .filter(|tag| tag.clone() != t)
+ .map(|tag| Value::String(t.clone()))
+ .collect();
+
+ e.get_header_mut()
+ .set("imag.tags", Value::Array(new_tags))
+ .map_err(|e| TagError::new(TagErrorKind::TagTypeError, Some(Box::new(e))))
+ .map(|_| ())
+ },
+
+ _ => unreachable!(),
+ }
}