diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2016-02-14 20:15:03 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2016-02-14 20:15:36 +0100 |
commit | 1ca9597ad62a92beaca11d4b945787ff02bf6dd6 (patch) | |
tree | c0b2465d249a197ad51a0d8dd851a61e53396f59 /libimagtag | |
parent | a2898dcc467bcaf1097b40b168056f865637c009 (diff) |
Implement: add::add_tag()
Diffstat (limited to 'libimagtag')
-rw-r--r-- | libimagtag/src/add.rs | 37 |
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!(), + } } |