summaryrefslogtreecommitdiffstats
path: root/libimagtag
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2016-02-14 20:15:03 +0100
committerMatthias Beyer <mail@beyermatthias.de>2016-02-14 20:15:36 +0100
commit1ca9597ad62a92beaca11d4b945787ff02bf6dd6 (patch)
treec0b2465d249a197ad51a0d8dd851a61e53396f59 /libimagtag
parenta2898dcc467bcaf1097b40b168056f865637c009 (diff)
Implement: add::add_tag()
Diffstat (limited to 'libimagtag')
-rw-r--r--libimagtag/src/add.rs37
1 files changed, 36 insertions, 1 deletions
diff --git a/libimagtag/src/add.rs b/libimagtag/src/add.rs
index e891a1ce..ebfaa257 100644
--- a/libimagtag/src/add.rs
+++ b/libimagtag/src/add.rs
@@ -1,8 +1,43 @@
+use toml::Value;
+
use libimagstore::store::Entry;
use result::Result;
use tag::Tag;
+use error::{TagError, TagErrorKind};
+
pub fn add_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 mut new_tags = tag_array.clone();
+ new_tags.push(Value::String(t.clone()));
+
+ e.get_header_mut()
+ .set("imag.tags", Value::Array(new_tags))
+ .map_err(|e| TagError::new(TagErrorKind::TagTypeError, Some(Box::new(e))))
+ .map(|_| ())
+ },
- unimplemented!()
+ _ => unreachable!(),
+ }
}