From c242a362e44180a9f114d471dae49e91fc0b2652 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 10 Apr 2018 22:32:50 +0200 Subject: [PATCH] Add id iterator --- lib/domain/libimagwiki/src/lib.rs | 1 + lib/domain/libimagwiki/src/wiki.rs | 46 ++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/lib/domain/libimagwiki/src/lib.rs b/lib/domain/libimagwiki/src/lib.rs index cd6ac333..fd8916aa 100644 --- a/lib/domain/libimagwiki/src/lib.rs +++ b/lib/domain/libimagwiki/src/lib.rs @@ -35,6 +35,7 @@ while_true, )] +extern crate filters; extern crate toml; extern crate toml_query; #[macro_use] extern crate error_chain; diff --git a/lib/domain/libimagwiki/src/wiki.rs b/lib/domain/libimagwiki/src/wiki.rs index 24629d74..56554a15 100644 --- a/lib/domain/libimagwiki/src/wiki.rs +++ b/lib/domain/libimagwiki/src/wiki.rs @@ -19,9 +19,14 @@ use std::path::PathBuf; +use filters::filter::Filter; + use libimagstore::store::Store; +use libimagstore::store::Entry; use libimagstore::store::FileLockEntry; use libimagstore::storeid::IntoStoreId; +use libimagstore::storeid::StoreId; +use libimagstore::storeid::StoreIdIteratorWithStore; use error::WikiError as WE; use error::Result; @@ -46,6 +51,47 @@ impl<'a, 'b> Wiki<'a, 'b> { self.0.retrieve(sid).map_err(WE::from) } + pub fn all_ids(&self) -> Result { + let filter = IdIsInWikiFilter(self.1); + Ok(WikiIdIterator(self.0.entries()?, filter)) + } + +} + +pub struct WikiIdIterator<'a>(StoreIdIteratorWithStore<'a>, IdIsInWikiFilter<'a>); + +impl<'a> Iterator for WikiIdIterator<'a> { + type Item = StoreId; + + fn next(&mut self) -> Option { + while let Some(next) = self.0.next() { + if self.1.filter(&next) { + return Some(next) + } + } + + None + } +} + +pub struct IdIsInWikiFilter<'a>(&'a str); + +impl<'a> IdIsInWikiFilter<'a> { + pub fn new(wiki_name: &'a str) -> Self { + IdIsInWikiFilter(wiki_name) + } +} + +impl<'a> Filter for IdIsInWikiFilter<'a> { + fn filter(&self, id: &StoreId) -> bool { + id.is_in_collection(&["wiki", &self.0]) + } +} + +impl<'a> Filter for IdIsInWikiFilter<'a> { + fn filter(&self, e: &Entry) -> bool { + e.get_location().is_in_collection(&["wiki", &self.0]) + } }