From 3be9407c6c7cb95833537198a092cdc902579e49 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 5 Oct 2019 21:45:00 +0200 Subject: [PATCH] Add Linkable::is_linked_to() Signed-off-by: Matthias Beyer --- lib/entry/libimagentrylink/src/linkable.rs | 35 ++++++++++++++++++++-- 1 file 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; } #[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 { + 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, id: &StoreId| -> Result { + 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(iter: I) -> Result @@ -294,8 +325,8 @@ fn alter_linking(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);