use super::*;
pub struct CursorIterator<'a> {
pub(crate) journal: &'a Journal
}
pub struct CursorReverseIterator<'a> {
pub(crate) journal: &'a Journal
}
pub struct Fields<'a> {
pub(crate) journal: &'a Journal
}
pub struct FieldNames<'a> {
pub(crate) journal: &'a Journal
}
pub struct UniqueValues<'a> {
pub(crate) journal: &'a Journal
}
impl<'a> Iterator for CursorIterator<'a> {
type Item = Result<Cursor<'a>, Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.journal.next() {
Ok(CursorMovement::EoF) => None,
Ok(CursorMovement::Done) => Some(Ok(Cursor { journal: self.journal })),
Ok(CursorMovement::Limited(_)) => Some(Ok(Cursor { journal: self.journal })),
Err(e) => Some(Err(e))
}
}
}
impl<'a> Iterator for CursorReverseIterator<'a> {
type Item = Result<Cursor<'a>, Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.journal.previous() {
Ok(CursorMovement::EoF) => None,
Ok(CursorMovement::Done) => Some(Ok(Cursor { journal: self.journal })),
Ok(CursorMovement::Limited(_)) => Some(Ok(Cursor { journal: self.journal })),
Err(e) => Some(Err(e))
}
}
}
impl<'a> IntoIterator for &'a Journal {
type IntoIter = CursorIterator<'a>;
type Item = Result<Cursor<'a>, Error>;
fn into_iter(self) -> Self::IntoIter {
CursorIterator { journal: self }
}
}
impl<'a> IntoIterator for Cursor<'a> {
type IntoIter = Fields<'a>;
type Item = Result<(String, String), Error>;
fn into_iter(self) -> Self::IntoIter {
Fields { journal: self.journal }
}
}
impl<'a> Iterator for Fields<'a> {
type Item = Result<(String, String), Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.journal.enumerate_fields() {
Ok(Enumeration::EoF) => None,
Ok(Enumeration::Value(v)) => Some(Ok(v)),
Err(e) => Some(Err(e))
}
}
}
impl<'a> Iterator for UniqueValues<'a> {
type Item = Result<String, Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.journal.enumerate_unique_values() {
Ok(Enumeration::EoF) => None,
Ok(Enumeration::Value(value)) => Some(Ok(value)),
Err(e) => Some(Err(e))
}
}
}
impl<'a> Iterator for FieldNames<'a> {
type Item = Result<String, Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.journal.enumerate_field_names() {
Ok(Enumeration::EoF) => None,
Ok(Enumeration::Value(v)) => Some(Ok(v)),
Err(e) => Some(Err(e))
}
}
}