diff --git a/lib/domain/libimagbookmark/src/store.rs b/lib/domain/libimagbookmark/src/store.rs index d11fe331..9e3d4429 100644 --- a/lib/domain/libimagbookmark/src/store.rs +++ b/lib/domain/libimagbookmark/src/store.rs @@ -36,9 +36,12 @@ pub trait BookmarkStore { fn add_bookmark<'a>(&'a self, url: Url) -> Result<(Uuid, FileLockEntry<'a>)>; fn get_bookmark_by_uuid<'a>(&'a self, uuid: &Uuid) -> Result>>; + fn get_bookmark_by_id<'a>(&'a self, sid: StoreId) -> Result>>; fn remove_bookmark_by_uuid(&self, uuid: &Uuid) -> Result<()>; + fn remove_bookmark<'a>(&self, fle: FileLockEntry<'a>) -> Result<()>; + fn all_bookmarks<'a>(&'a self) -> Result>; } @@ -58,10 +61,41 @@ impl BookmarkStore for Store { id_for_uuid(uuid).and_then(|id| self.get(id)) } + /// Get a bookmark by store id + /// + /// + /// # Warning + /// + /// Returns an error if the StoreId does not refer to an entry that is a Bookmark. + /// If you want to ignore these errors on this API level and handle these errors yourself, + /// use Store::get() + /// + fn get_bookmark_by_id<'a>(&'a self, sid: StoreId) -> Result>> { + if let Some(entry) = self.get(sid)? { + if !entry.is_bookmark()? { + return Err(format_err!("Not a bookmark: {}", entry.get_location())); + } else { + Ok(Some(entry)) + } + } else { + Ok(None) + } + } + fn remove_bookmark_by_uuid(&self, uuid: &Uuid) -> Result<()> { id_for_uuid(uuid).and_then(|id| self.delete(id)) } + fn remove_bookmark<'a>(&self, fle: FileLockEntry<'a>) -> Result<()> { + if fle.is_bookmark()? { + let id = fle.get_location().clone(); + drop(fle); + self.delete(id) + } else { + Err(format_err!("Not a bookmark: {}", fle.get_location())) + } + } + fn all_bookmarks<'a>(&'a self) -> Result> { self.entries()?.in_collection("bookmark") }