diff --git a/libimaglink/src/internal.rs b/libimaglink/src/internal.rs index f6539014..e22214d1 100644 --- a/libimaglink/src/internal.rs +++ b/libimaglink/src/internal.rs @@ -45,25 +45,14 @@ impl InternalLinker for Entry { return Err(e); } let link = link.get_location().clone(); - let link = link.to_str(); - if link.is_none() { - return Err(LinkError::new(LinkErrorKind::InternalConversionError, None)); - } - let link = link.unwrap(); - - new_links.push(String::from(link)); + new_links.push(link); } - let new_links = new_links - .into_iter() - .unique() - .map(|s| Value::String(s)) - .sorted_by(|a, b| { - match (a, b) { - (&Value::String(ref a), &Value::String(ref b)) => Ord::cmp(a, b), - _ => unreachable!() - } - }); + let new_links = links_into_values(new_links); + if new_links.iter().any(|o| o.is_none()) { + return Err(LinkError::new(LinkErrorKind::InternalConversionError, None)); + } + let new_links = new_links.into_iter().map(|o| o.unwrap()).collect(); process_rw_result(self.get_header_mut().set("imag.links", Value::Array(new_links))) } @@ -100,8 +89,8 @@ impl InternalLinker for Entry { } -fn rewrite_links(header: &mut EntryHeader, links: Vec) -> Result<()> { - let links : Vec> = links +fn links_into_values(links: Vec) -> Vec> { + links .into_iter() .map(|s| s.to_str().map(|s| String::from(s))) .unique() @@ -112,7 +101,11 @@ fn rewrite_links(header: &mut EntryHeader, links: Vec) -> Result<()> { (&None, _) | (_, &None) => Ordering::Equal, _ => unreachable!() } - }); + }) +} + +fn rewrite_links(header: &mut EntryHeader, links: Vec) -> Result<()> { + let links = links_into_values(links); if links.iter().any(|o| o.is_none()) { // if any type convert failed we fail as well @@ -131,23 +124,7 @@ fn add_foreign_link(target: &mut Entry, from: StoreId) -> Result<()> { target.get_internal_links() .and_then(|mut links| { links.push(from); - let links : Vec> = links - .into_iter() - .map(|s| { - match s.to_str() { - Some(s) => Some(String::from(s)), - _ => None - } - }) - .unique() - .map(|elem| elem.map(|s| Value::String(s))) - .sorted_by(|a, b| { - match (a, b) { - (&Some(Value::String(ref a)), &Some(Value::String(ref b))) => Ord::cmp(a, b), - (&None, _) | (_, &None) => Ordering::Equal, - _ => unreachable!() - } - }); + let links = links_into_values(links); if links.iter().any(|o| o.is_none()) { Err(LinkError::new(LinkErrorKind::InternalConversionError, None)) } else {