summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2017-09-15 13:53:52 +0200
committerGitHub <noreply@github.com>2017-09-15 13:53:52 +0200
commitb4e6200eab8e50ec4447e2a677d4a1876938cb17 (patch)
tree8285fa482a7a178cd68332ed7f7288a83c1cdcc6
parent2f0fa2b6ca7af88217f8c7b844d2c0ba9f41a6cd (diff)
parent8b8e4e9c6eddafcb0311e7b968e88873af281c32 (diff)
downloadimag-b4e6200eab8e50ec4447e2a677d4a1876938cb17.zip
imag-b4e6200eab8e50ec4447e2a677d4a1876938cb17.tar.gz
Merge pull request #1070 from matthiasbeyer/libimagstore/iter
libimagstore: iter
-rw-r--r--lib/core/libimagstore/src/iter.rs95
-rw-r--r--lib/core/libimagstore/src/lib.rs1
2 files changed, 96 insertions, 0 deletions
diff --git a/lib/core/libimagstore/src/iter.rs b/lib/core/libimagstore/src/iter.rs
new file mode 100644
index 0000000..b351a78
--- /dev/null
+++ b/lib/core/libimagstore/src/iter.rs
@@ -0,0 +1,95 @@
+//
+// imag - the personal information management suite for the commandline
+// Copyright (C) 2015, 2016 Matthias Beyer <mail@beyermatthias.de> 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
+//
+
+macro_rules! mk_iterator_mod {
+ {
+ modname = $modname:ident,
+ itername = $itername:ident,
+ iteryield = $yield:ty,
+ extname = $extname:ident,
+ extfnname = $extfnname:ident,
+ fun = $fun:expr
+ } => {
+ pub mod $modname {
+ use storeid::StoreIdIterator;
+ use storeid::StoreId;
+ #[allow(unused_imports)]
+ use store::FileLockEntry;
+ use store::Store;
+ use error::Result;
+
+ pub struct $itername<'a>(StoreIdIterator, &'a Store);
+
+ impl<'a> Iterator for $itername<'a> {
+ type Item = Result<$yield>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.0.next().map(|id| $fun(id, self.1))
+ }
+ }
+
+ pub trait $extname<'a> {
+ fn $extfnname(self, store: &'a Store) -> $itername<'a>;
+ }
+
+ impl<'a> $extname<'a> for StoreIdIterator {
+ fn $extfnname(self, store: &'a Store) -> $itername<'a> {
+ $itername(self, store)
+ }
+ }
+ }
+ }
+}
+
+mk_iterator_mod! {
+ modname = create,
+ itername = StoreCreateIterator,
+ iteryield = FileLockEntry<'a>,
+ extname = StoreIdCreateIteratorExtension,
+ extfnname = into_create_iter,
+ fun = |id: StoreId, store: &'a Store| store.create(id)
+}
+
+mk_iterator_mod! {
+ modname = delete,
+ itername = StoreDeleteIterator,
+ iteryield = (),
+ extname = StoreIdDeleteIteratorExtension,
+ extfnname = into_delete_iter,
+ fun = |id: StoreId, store: &'a Store| store.delete(id)
+}
+
+mk_iterator_mod! {
+ modname = get,
+ itername = StoreGetIterator,
+ iteryield = Option<FileLockEntry<'a>>,
+ extname = StoreIdGetIteratorExtension,
+ extfnname = into_get_iter,
+ fun = |id: StoreId, store: &'a Store| store.get(id)
+}
+
+mk_iterator_mod! {
+ modname = retrieve,
+ itername = StoreRetrieveIterator,
+ iteryield = FileLockEntry<'a>,
+ extname = StoreIdRetrieveIteratorExtension,
+ extfnname = into_retrieve_iter,
+ fun = |id: StoreId, store: &'a Store| store.retrieve(id)
+}
+
diff --git a/lib/core/libimagstore/src/lib.rs b/lib/core/libimagstore/src/lib.rs
index 891eb84..3b665a5 100644
--- a/lib/core/libimagstore/src/lib.rs
+++ b/lib/core/libimagstore/src/lib.rs
@@ -56,6 +56,7 @@ extern crate libimagutil;
pub mod storeid;
pub mod error;
+pub mod iter;
pub mod store;
mod configuration;
pub mod file_abstraction;