summaryrefslogtreecommitdiffstats
path: root/libimagtag
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2016-02-15 14:03:56 +0100
committerMatthias Beyer <mail@beyermatthias.de>2016-02-15 14:09:22 +0100
commit5c92624989f893d875c57b0173137c92dfea55bb (patch)
treef65f7418d8da5671beb530b1ae9b3e6a8c28242f /libimagtag
parent1ca9597ad62a92beaca11d4b945787ff02bf6dd6 (diff)
Refactor everything into one trait
Diffstat (limited to 'libimagtag')
-rw-r--r--libimagtag/src/add.rs33
-rw-r--r--libimagtag/src/check.rs37
-rw-r--r--libimagtag/src/error.rs2
-rw-r--r--libimagtag/src/lib.rs4
-rw-r--r--libimagtag/src/remove.rs41
-rw-r--r--libimagtag/src/tagable.rs173
6 files changed, 176 insertions, 114 deletions
diff --git a/libimagtag/src/add.rs b/libimagtag/src/add.rs
index ebfaa257..40749957 100644
--- a/libimagtag/src/add.rs
+++ b/libimagtag/src/add.rs
@@ -7,37 +7,4 @@ 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(|_| ())
- },
-
- _ => unreachable!(),
- }
}
diff --git a/libimagtag/src/check.rs b/libimagtag/src/check.rs
index ecc092dc..7c98e745 100644
--- a/libimagtag/src/check.rs
+++ b/libimagtag/src/check.rs
@@ -7,45 +7,8 @@ use tag::Tag;
use error::{TagError, TagErrorKind};
pub fn has_tag(e: &Entry, t: &Tag) -> Result<bool> {
- header_has_tag(e.get_header(), t)
}
pub fn has_tags(e: &Entry, tags: &Vec<Tag>) -> Result<bool> {
- let hdr = e.get_header();
- let mut result = true;
-
- for tag in tags {
- let check = header_has_tag(hdr, tag);
- if check.is_err() {
- return Err(check.err().unwrap());
- }
- let check = check.unwrap();
-
- result = result && check;
- }
-
- Ok(result)
-}
-
-fn header_has_tag(head: &EntryHeader, t: &Tag) -> Result<bool> {
- let tags = head.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));
- }
-
- Ok(tags
- .iter()
- .any(|tag| {
- match tag {
- &Value::String(ref s) => { s == t },
- _ => unreachable!()
- }
- }))
}
diff --git a/libimagtag/src/error.rs b/libimagtag/src/error.rs
index 58615a6a..dcd36426 100644
--- a/libimagtag/src/error.rs
+++ b/libimagtag/src/error.rs
@@ -8,12 +8,14 @@ use std::fmt;
pub enum TagErrorKind {
TagTypeError,
HeaderReadError,
+ HeaderWriteError,
}
fn tag_error_type_as_str(e: &TagErrorKind) -> &'static str {
match e {
&TagErrorKind::TagTypeError => "Entry Header Tag Type wrong",
&TagErrorKind::HeaderReadError => "Error while reading entry header",
+ &TagErrorKind::HeaderWriteError=> "Error while writing entry header",
}
}
diff --git a/libimagtag/src/lib.rs b/libimagtag/src/lib.rs
index 252f6f68..ad9e5e7b 100644
--- a/libimagtag/src/lib.rs
+++ b/libimagtag/src/lib.rs
@@ -3,10 +3,8 @@ extern crate toml;
extern crate libimagstore;
-pub mod add;
-pub mod check;
pub mod error;
-pub mod remove;
pub mod result;
pub mod tag;
+pub mod tagable;
pub mod util;
diff --git a/libimagtag/src/remove.rs b/libimagtag/src/remove.rs
index 084cee93..42e02719 100644
--- a/libimagtag/src/remove.rs
+++ b/libimagtag/src/remove.rs
@@ -7,45 +7,4 @@ use tag::Tag;
use error::{TagError, TagErrorKind};
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!(),
- }
}
diff --git a/libimagtag/src/tagable.rs b/libimagtag/src/tagable.rs
new file mode 100644
index 00000000..a5c76c8d
--- /dev/null
+++ b/libimagtag/src/tagable.rs
@@ -0,0 +1,173 @@
+use libimagstore::store::{Entry, EntryHeader};
+
+use error::{TagError, TagErrorKind};
+use result::Result;
+use tag::Tag;
+
+use toml::Value;
+
+pub trait Tagable {
+
+ fn get_tags(&self) -> Result<Vec<Tag>>;
+ fn set_tags(&mut self, ts: Vec<Tag>) -> Result<()>;
+
+ fn add_tag(&mut self, t: Tag) -> Result<()>;
+ fn remove_tag(&mut self, t: Tag) -> Result<()>;
+
+ fn has_tag(&self, t: &Tag) -> Result<bool>;
+ fn has_tags(&self, ts: &Vec<Tag>) -> Result<bool>;
+
+}
+
+impl Tagable for EntryHeader {
+
+ fn get_tags(&self) -> Result<Vec<Tag>> {
+ let tags = self.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();
+
+ match tags {
+ Some(Value::Array(tags)) => {
+ if !tags.iter().all(|t| match t { &Value::String(_) => true, _ => false }) {
+ return Err(TagError::new(TagErrorKind::TagTypeError, None));
+ }
+
+ Ok(tags.iter()
+ .cloned()
+ .map(|t| {
+ match t {
+ Value::String(s) => s,
+ _ => unreachable!(),
+ }
+ })
+ .collect())
+ },
+ None => Ok(vec![]),
+ _ => Err(TagError::new(TagErrorKind::TagTypeError, None)),
+ }
+ }
+
+ fn set_tags(&mut self, ts: Vec<Tag>) -> Result<()> {
+ let a = ts.iter().map(|t| Value::String(t.clone())).collect();
+ self.set("imag.tags", Value::Array(a))
+ .map(|_| ())
+ .map_err(|e| TagError::new(TagErrorKind::HeaderWriteError, Some(Box::new(e))))
+ }
+
+ fn add_tag(&mut self, t: Tag) -> Result<()> {
+ let tags = self.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()));
+
+ self.set("imag.tags", Value::Array(new_tags))
+ .map_err(|e| TagError::new(TagErrorKind::TagTypeError, Some(Box::new(e))))
+ .map(|_| ())
+ },
+
+ _ => unreachable!(),
+ }
+ }
+
+ fn remove_tag(&mut self, t: Tag) -> Result<()> {
+ let tags = self.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 tag_array = tag_array.clone();
+ tag_array.retain(|tag| {
+ match tag {
+ &Value::String(ref s) => s.clone() != t,
+ _ => unreachable!(),
+ }
+ });
+
+ self.set("imag.tags", Value::Array(tag_array))
+ .map_err(|e| TagError::new(TagErrorKind::TagTypeError, Some(Box::new(e))))
+ .map(|_| ())
+ },
+
+ _ => unreachable!(),
+ }
+ }
+
+ fn has_tag(&self, t: &Tag) -> Result<bool> {
+ let tags = self.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));
+ }
+
+ Ok(tags
+ .iter()
+ .any(|tag| {
+ match tag {
+ &Value::String(ref s) => { s == t },
+ _ => unreachable!()
+ }
+ }))
+ }
+
+ fn has_tags(&self, tags: &Vec<Tag>) -> Result<bool> {
+ let mut result = true;
+ for tag in tags {
+ let check = self.has_tag(tag);
+ if check.is_err() {
+ return Err(check.err().unwrap());
+ }
+ let check = check.unwrap();
+
+ result = result && check;
+ }
+
+ Ok(result)
+ }
+
+}
+