// // 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())) }