From f1be77081c18bb3960fb084f4100f7c2f68f9330 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Mon, 23 May 2016 18:31:14 +0200 Subject: [PATCH] Add diary iterator --- libimagdiary/src/iter.rs | 108 +++++++++++++++++++++++++++++++++++++++ libimagdiary/src/lib.rs | 3 ++ 2 files changed, 111 insertions(+) create mode 100644 libimagdiary/src/iter.rs diff --git a/libimagdiary/src/iter.rs b/libimagdiary/src/iter.rs new file mode 100644 index 00000000..ce7aec78 --- /dev/null +++ b/libimagdiary/src/iter.rs @@ -0,0 +1,108 @@ +use std::fmt::{Debug, Formatter, Error as FmtError}; +use std::result::Result as RResult; + +use libimagstore::store::Store; +use libimagstore::storeid::StoreIdIterator; + +use diaryid::DiaryId; +use diaryid::FromStoreId; +use is_in_diary::IsInDiary; +use entry::Entry as DiaryEntry; +use error::DiaryError as DE; +use error::DiaryErrorKind as DEK; +use result::Result; + +/// A iterator for iterating over diary entries +pub struct DiaryEntryIterator<'a> { + store: &'a Store, + name: &'a str, + iter: StoreIdIterator, + + year: Option, + month: Option, + day: Option, +} + +impl<'a> Debug for DiaryEntryIterator<'a> { + + fn fmt(&self, fmt: &mut Formatter) -> RResult<(), FmtError> { + write!(fmt, "DiaryEntryIterator", + self.name, self.year, self.month, self.day) + } + +} + +impl<'a> DiaryEntryIterator<'a> { + + pub fn new(diaryname: &'a str, store: &'a Store, iter: StoreIdIterator) -> DiaryEntryIterator<'a> { + DiaryEntryIterator { + store: store, + name: diaryname, + iter: iter, + + year: None, + month: None, + day: None, + } + } + + // Filter by year, get all diary entries for this year + pub fn year(mut self, year: i32) -> DiaryEntryIterator<'a> { + self.year = Some(year); + self + } + + // Filter by month, get all diary entries for this month (every year) + pub fn month(mut self, month: u32) -> DiaryEntryIterator<'a> { + self.month = Some(month); + self + } + + // Filter by day, get all diary entries for this day (every year, every year) + pub fn day(mut self, day: u32) -> DiaryEntryIterator<'a> { + self.day = Some(day); + self + } + +} + +impl<'a> Iterator for DiaryEntryIterator<'a> { + type Item = Result>; + + fn next(&mut self) -> Option>> { + loop { + let next = self.iter.next(); + debug!("Next element: {:?}", next); + if next.is_none() { + return None; + } + let next = next.unwrap(); + + if next.is_in_diary(self.name) { + debug!("Seems to be in diary: {:?}", next); + let id = DiaryId::from_storeid(&next); + if id.is_none() { + continue; + } + let id = id.unwrap(); + + let y = match self.year { None => true, Some(y) => y == id.year() }; + let m = match self.month { None => true, Some(m) => m == id.month() }; + let d = match self.day { None => true, Some(d) => d == id.day() }; + + if y && m && d { + return Some(self + .store + .retrieve(next) + .map(|fle| DiaryEntry::new(fle)) + .map_err(|e| DE::new(DEK::StoreReadError, Some(Box::new(e)))) + ); + } + } else { + debug!("Not in the requested diary ({}): {:?}", self.name, next); + } + } + } + +} + diff --git a/libimagdiary/src/lib.rs b/libimagdiary/src/lib.rs index b0275040..53035b00 100644 --- a/libimagdiary/src/lib.rs +++ b/libimagdiary/src/lib.rs @@ -13,3 +13,6 @@ extern crate libimagrt; module_entry_path_mod!("diary", "0.1.0"); +pub mod error; +pub mod iter; +pub mod result;