Implement get_external_links()
This commit is contained in:
parent
5645edeeff
commit
91caa0c665
1 changed files with 26 additions and 3 deletions
|
@ -91,7 +91,7 @@ impl<'a> Link<'a> {
|
||||||
pub trait ExternalLinker : InternalLinker {
|
pub trait ExternalLinker : InternalLinker {
|
||||||
|
|
||||||
/// Get the external links from the implementor object
|
/// Get the external links from the implementor object
|
||||||
fn get_external_links(&self) -> Result<Vec<Url>>;
|
fn get_external_links(&self, store: &Store) -> Result<Vec<Url>>;
|
||||||
|
|
||||||
/// Set the external links for the implementor object
|
/// Set the external links for the implementor object
|
||||||
fn set_external_links(&mut self, links: Vec<Url>) -> Result<Vec<Url>>;
|
fn set_external_links(&mut self, links: Vec<Url>) -> Result<Vec<Url>>;
|
||||||
|
@ -104,17 +104,40 @@ pub trait ExternalLinker : InternalLinker {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check whether the StoreId starts with `/link/external/`
|
||||||
|
fn is_link_store_id(id: &StoreId) -> bool {
|
||||||
|
id.starts_with("/link/external/")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_external_link_from_file(entry: &FileLockEntry) -> Result<Url> {
|
||||||
|
Link::get_link_uri_from_filelockentry(entry) // TODO: Do not hide error by using this function
|
||||||
|
.ok_or(LE::new(LEK::StoreReadError, None))
|
||||||
|
}
|
||||||
|
|
||||||
/// Implement ExternalLinker for Entry, hiding the fact that there is no such thing as an external
|
/// Implement ExternalLinker for Entry, hiding the fact that there is no such thing as an external
|
||||||
/// link in an entry, but internal links to other entries which serve as external links, as one
|
/// link in an entry, but internal links to other entries which serve as external links, as one
|
||||||
/// entry in the store can only have one external link.
|
/// entry in the store can only have one external link.
|
||||||
impl ExternalLinker for Entry {
|
impl ExternalLinker for Entry {
|
||||||
|
|
||||||
/// Get the external links from the implementor object
|
/// Get the external links from the implementor object
|
||||||
fn get_external_links(&self) -> Result<Vec<Url>> {
|
fn get_external_links(&self, store: &Store) -> Result<Vec<Url>> {
|
||||||
// Iterate through all internal links and filter for FileLockEntries which live in
|
// Iterate through all internal links and filter for FileLockEntries which live in
|
||||||
// /link/external/<SHA> -> load these files and get the external link from their headers,
|
// /link/external/<SHA> -> load these files and get the external link from their headers,
|
||||||
// put them into the return vector.
|
// put them into the return vector.
|
||||||
unimplemented!()
|
self.get_internal_links()
|
||||||
|
.map(|vect| {
|
||||||
|
vect.into_iter()
|
||||||
|
.filter(is_link_store_id)
|
||||||
|
.map(|id| {
|
||||||
|
match store.retrieve(id) {
|
||||||
|
Ok(f) => get_external_link_from_file(&f),
|
||||||
|
Err(e) => Err(LE::new(LEK::StoreReadError, Some(Box::new(e)))),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter_map(|x| x.ok()) // TODO: Do not ignore error here
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.map_err(|e| LE::new(LEK::StoreReadError, Some(Box::new(e))))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the external links for the implementor object
|
/// Set the external links for the implementor object
|
||||||
|
|
Loading…
Reference in a new issue