summaryrefslogtreecommitdiffstats
path: root/lib/entry
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-10-05 21:45:00 +0200
committerMatthias Beyer <mail@beyermatthias.de>2019-10-09 19:44:01 +0200
commit3be9407c6c7cb95833537198a092cdc902579e49 (patch)
tree39eb839d1b8bff21e6c7cc1254f347a45ade1d77 /lib/entry
parentb2dffff6e891fff3257f65684599a36e13b451a3 (diff)
Add Linkable::is_linked_to()
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'lib/entry')
-rw-r--r--lib/entry/libimagentrylink/src/linkable.rs35
1 files changed, 33 insertions, 2 deletions
diff --git a/lib/entry/libimagentrylink/src/linkable.rs b/lib/entry/libimagentrylink/src/linkable.rs
index 32157c3d..bbcf4d41 100644
--- a/lib/entry/libimagentrylink/src/linkable.rs
+++ b/lib/entry/libimagentrylink/src/linkable.rs
@@ -62,6 +62,8 @@ pub trait Linkable {
/// Remove a directional link: self -> otehr
fn remove_link_to(&mut self, other: &mut Entry) -> Result<()>;
+ /// Check whether an entry is linked to another entry
+ fn is_linked_to(&self, other: &Entry) -> Result<bool>;
}
#[derive(Serialize, Deserialize, Debug)]
@@ -274,6 +276,35 @@ impl Linkable for Entry {
})
}
+ /// Check whether an entry is linked to another entry
+ fn is_linked_to(&self, other: &Entry) -> Result<bool> {
+ let left_partial = get_link_partial(self)?
+ .ok_or_else(|| format_err!("Cannot read links from {}", self.get_location()))?;
+ let right_partial = get_link_partial(&other)?
+ .ok_or_else(|| format_err!("Cannot read links from {}", other.get_location()))?;
+
+ let left_id = self.get_location();
+ let right_id = other.get_location();
+
+ let strary_contains = |sary: &Vec<String>, id: &StoreId| -> Result<bool> {
+ sary.iter().map(|e| {
+ StoreId::new(PathBuf::from(e)).map(|e| e == *id)
+ }).fold(Ok(false), |a, e| a.and_then(|_| e))
+ };
+
+ let is_linked_from = |partial: &LinkPartial, id| {
+ partial.from.as_ref().map(|f| strary_contains(f, id)).unwrap_or(Ok(false))
+ };
+ let is_linked_to = |partial: &LinkPartial, id| {
+ partial.to.as_ref().map(|t| strary_contains(t, id)).unwrap_or(Ok(false))
+ };
+
+ Ok({
+ is_linked_from(&left_partial, &right_id)? && is_linked_from(&right_partial, &left_id)?
+ ||
+ is_linked_to(&left_partial, &right_id)? && is_linked_to(&right_partial, &left_id)?
+ })
+ }
}
fn link_string_iter_to_link_iter<I>(iter: I) -> Result<LinkIter>
@@ -294,8 +325,8 @@ fn alter_linking<F>(left: &mut Entry, right: &mut Entry, f: F) -> Result<()>
Ok(get_link_partial(e)?.unwrap_or_else(LinkPartial::default))
};
- let left_partial : LinkPartial = get_partial(left)?;
- let right_partial : LinkPartial = get_partial(right)?;
+ let left_partial : LinkPartial = get_partial(&left)?;
+ let right_partial : LinkPartial = get_partial(&right)?;
trace!("Partial left before: {:?}", left_partial);
trace!("Partial right before: {:?}", right_partial);