From c58b0d323e0def63d545f4823d2ec7597fc133f7 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Fri, 6 Dec 2019 20:03:29 +0100 Subject: [PATCH] Remove old implementation, define interface for new implementation Signed-off-by: Matthias Beyer --- lib/domain/libimagbookmark/Cargo.toml | 6 + lib/domain/libimagbookmark/src/collection.rs | 191 ------------------- lib/domain/libimagbookmark/src/lib.rs | 5 +- lib/domain/libimagbookmark/src/link.rs | 76 -------- lib/domain/libimagbookmark/src/store.rs | 67 +++++++ 5 files changed, 76 insertions(+), 269 deletions(-) delete mode 100644 lib/domain/libimagbookmark/src/collection.rs delete mode 100644 lib/domain/libimagbookmark/src/link.rs create mode 100644 lib/domain/libimagbookmark/src/store.rs diff --git a/lib/domain/libimagbookmark/Cargo.toml b/lib/domain/libimagbookmark/Cargo.toml index 9e55b986..4f766009 100644 --- a/lib/domain/libimagbookmark/Cargo.toml +++ b/lib/domain/libimagbookmark/Cargo.toml @@ -29,3 +29,9 @@ libimagerror = { version = "0.10.0", path = "../../../lib/core/libimagerror" libimagentrylink = { version = "0.10.0", path = "../../../lib/entry/libimagentrylink" } libimagentryurl = { version = "0.10.0", path = "../../../lib/entry/libimagentryurl" } +[dependencies.uuid] +version = "0.7" +default-features = false +features = ["serde", "v4"] + + diff --git a/lib/domain/libimagbookmark/src/collection.rs b/lib/domain/libimagbookmark/src/collection.rs deleted file mode 100644 index a50208ad..00000000 --- a/lib/domain/libimagbookmark/src/collection.rs +++ /dev/null @@ -1,191 +0,0 @@ -// -// imag - the personal information management suite for the commandline -// Copyright (C) 2015-2019 Matthias Beyer and contributors -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; version -// 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// - -//! BookmarkCollection module -//! -//! A BookmarkCollection is nothing more than a simple store entry. One can simply call functions -//! from the libimagentryurl::linker::UrlLinker trait on this to generate external links. -//! -//! The BookmarkCollection type offers helper functions to get all links or such things. - -use regex::Regex; - -use failure::Fallible as Result; -use failure::ResultExt; -use failure::Error; - -use libimagstore::store::Store; -use libimagstore::store::Entry; -use libimagstore::store::FileLockEntry; -use libimagstore::storeid::StoreId; -use libimagentryurl::linker::UrlLinker; -use libimagentryurl::iter::UrlIter; -use libimagentrylink::linkable::Linkable; -use libimagentrylink::link::Link as StoreLink; - -use crate::link::Link; - -use self::iter::LinksMatchingRegexIter; - -pub trait BookmarkCollectionStore<'a> { - fn new(&'a self, name: &str) -> Result>; - fn get(&'a self, name: &str) -> Result>>; - fn delete(&'a self, name: &str) -> Result<()>; -} - -impl<'a> BookmarkCollectionStore<'a> for Store { - - #[allow(clippy::new_ret_no_self)] - fn new(&'a self, name: &str) -> Result> { - crate::module_path::new_id(name) - .and_then(|id| self.create(id) - .context("Failed to create FileLockEntry") - .map_err(Error::from)) - .context("Failed to create Id for new Bookmark Collection") - .map_err(Error::from) - } - - fn get(&'a self, name: &str) -> Result>> { - crate::module_path::new_id(name) - .and_then(|id| self.get(id) - .context("Failed to get FileLockEntry") - .map_err(Error::from)) - .context("Failed to get Bookmark Collection") - .map_err(Error::from) - } - - fn delete(&'a self, name: &str) -> Result<()> { - crate::module_path::new_id(name) - .and_then(|id| self.delete(id) - .context("Failed to delete FileLockEntry") - .map_err(Error::from)) - .context("Failed to delete Bookmark Collection") - .map_err(Error::from) - } - -} - -pub trait BookmarkCollection : Sized + Linkable + UrlLinker { - fn get_links<'a>(&self, store: &'a Store) -> Result>; - fn link_entries(&self) -> Result>; - fn add_link(&mut self, store: &Store, l: Link) -> Result>; - fn get_links_matching<'a>(&self, store: &'a Store, r: Regex) -> Result>; - fn remove_link(&mut self, store: &Store, l: Link) -> Result>; -} - -impl BookmarkCollection for Entry { - - fn get_links<'a>(&self, store: &'a Store) -> Result> { - self.get_urls(store) - } - - #[allow(clippy::redundant_closure)] - fn link_entries(&self) -> Result> { - use libimagentryurl::util::is_external_link_storeid; - self.links().map(|v| v.filter(|id| is_external_link_storeid(id)).collect()) - } - - fn add_link(&mut self, store: &Store, l: Link) -> Result> { - use crate::link::IntoUrl; - l.into_url().and_then(|url| self.add_url(store, url)) - } - - fn get_links_matching<'a>(&self, store: &'a Store, r: Regex) -> Result> { - use self::iter::IntoLinksMatchingRegexIter; - self.get_urls(store).map(|iter| iter.matching_regex(r)) - } - - fn remove_link(&mut self, store: &Store, l: Link) -> Result> { - use crate::link::IntoUrl; - l.into_url().and_then(|url| self.remove_url(store, url)) - } - -} - -pub mod iter { - use crate::link::Link; - use failure::Fallible as Result; - use regex::Regex; - - use libimagentryurl::iter::UrlIter; - - pub struct LinkIter(I) - where I: Iterator; - - impl> LinkIter { - pub fn new(i: I) -> LinkIter { - LinkIter(i) - } - } - - impl> Iterator for LinkIter { - type Item = Link; - - fn next(&mut self) -> Option { - self.0.next() - } - } - - impl From for LinkIter where I: Iterator { - fn from(i: I) -> LinkIter { - LinkIter(i) - } - } - - pub struct LinksMatchingRegexIter<'a>(UrlIter<'a>, Regex); - - impl<'a> LinksMatchingRegexIter<'a> { - pub fn new(i: UrlIter<'a>, r: Regex) -> LinksMatchingRegexIter<'a> { - LinksMatchingRegexIter(i, r) - } - } - - impl<'a> Iterator for LinksMatchingRegexIter<'a> { - type Item = Result; - - fn next(&mut self) -> Option { - loop { - let n = match self.0.next() { - Some(Ok(n)) => n, - Some(Err(e)) => return Some(Err(e)), - None => return None, - }; - - let s = n.into_string(); - if self.1.is_match(&s[..]) { - return Some(Ok(Link::from(s))) - } else { - continue; - } - } - } - } - - pub trait IntoLinksMatchingRegexIter<'a> { - fn matching_regex(self, _: Regex) -> LinksMatchingRegexIter<'a>; - } - - impl<'a> IntoLinksMatchingRegexIter<'a> for UrlIter<'a> { - fn matching_regex(self, r: Regex) -> LinksMatchingRegexIter<'a> { - LinksMatchingRegexIter(self, r) - } - } - -} - diff --git a/lib/domain/libimagbookmark/src/lib.rs b/lib/domain/libimagbookmark/src/lib.rs index c8b2c59c..455a2a3f 100644 --- a/lib/domain/libimagbookmark/src/lib.rs +++ b/lib/domain/libimagbookmark/src/lib.rs @@ -38,6 +38,7 @@ )] extern crate url; +extern crate uuid; extern crate regex; #[macro_use] extern crate failure; @@ -48,5 +49,5 @@ extern crate libimagentryurl; module_entry_path_mod!("bookmark"); -pub mod collection; -pub mod link; +pub mod store; + diff --git a/lib/domain/libimagbookmark/src/link.rs b/lib/domain/libimagbookmark/src/link.rs deleted file mode 100644 index 8210162d..00000000 --- a/lib/domain/libimagbookmark/src/link.rs +++ /dev/null @@ -1,76 +0,0 @@ -// -// imag - the personal information management suite for the commandline -// Copyright (C) 2015-2019 Matthias Beyer and contributors -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; version -// 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// - -use std::ops::{Deref, DerefMut}; - -use failure::Fallible as Result; -use failure::ResultExt; -use failure::Error; -use failure::err_msg; - -use url::Url; - -#[derive(Debug, Clone)] -pub struct Link(String); - -impl From for Link { - - fn from(s: String) -> Link { - Link(s) - } - -} - -impl<'a> From<&'a str> for Link { - - fn from(s: &'a str) -> Link { - Link(String::from(s)) - } - -} - -impl Deref for Link { - type Target = String; - - fn deref(&self) -> &String { - &self.0 - } - -} - -impl DerefMut for Link { - - fn deref_mut(&mut self) -> &mut String { - &mut self.0 - } - -} - -pub trait IntoUrl { - fn into_url(self) -> Result; -} - -impl IntoUrl for Link { - - fn into_url(self) -> Result { - Url::parse(&self[..]).context(err_msg("Link parsing error")).map_err(Error::from) - } - -} - diff --git a/lib/domain/libimagbookmark/src/store.rs b/lib/domain/libimagbookmark/src/store.rs new file mode 100644 index 00000000..32401228 --- /dev/null +++ b/lib/domain/libimagbookmark/src/store.rs @@ -0,0 +1,67 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015-2019 Matthias Beyer and contributors +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; version +// 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// + +use failure::Fallible as Result; +use uuid::Uuid; +use url::Url; + +use libimagstore::store::Store; +use libimagstore::storeid::StoreId; +use libimagstore::store::FileLockEntry; +use libimagstore::iter::Entries; +use libimagentryurl::link::Link; + + +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 remove_bookmark_by_uuid(&self, uuid: &Uuid) -> Result<()>; + + fn all_bookmarks<'a>(&'a self) -> Result>; + +} + +impl BookmarkStore for Store { + fn add_bookmark<'a>(&'a self, url: Url) -> Result<(Uuid, FileLockEntry<'a>)> { + let uuid = uuid::Uuid::new_v4(); + id_for_uuid(&uuid) + .and_then(|id| self.create(id)) + .and_then(|mut entry| entry.set_url(url).map(|_| (uuid, entry))) + } + + fn get_bookmark_by_uuid<'a>(&'a self, uuid: &Uuid) -> Result>> { + id_for_uuid(uuid).and_then(|id| self.get(id)) + } + + fn remove_bookmark_by_uuid(&self, uuid: &Uuid) -> Result<()> { + id_for_uuid(uuid).and_then(|id| self.delete(id)) + } + + fn all_bookmarks<'a>(&'a self) -> Result> { + self.entries()?.in_collection("bookmark") + } +} + +fn id_for_uuid(uuid: &Uuid) -> Result { + crate::module_path::new_id(uuid.to_hyphenated().encode_lower(&mut Uuid::encode_buffer())) +} +