use {
crate::{
iter::sealed::{Sealed1, Sealed2},
Extract, ExtractOwned,
},
tokio_postgres::Row,
};
#[cfg(test)]
mod tests;
pub struct ExtractIter<T, I>
where
T: ExtractOwned,
I: Iterator<Item = Row>,
{
iter: I,
columns: Option<T::Columns>,
}
impl<T, I> Iterator for ExtractIter<T, I>
where
T: ExtractOwned,
I: Iterator<Item = Row>,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
Some(T::extract(&mut self.columns, &self.iter.next()?))
}
}
pub trait IterExtractExt: Iterator<Item = Row> + Sized + Sealed2 {
fn extract<T: ExtractOwned>(self) -> ExtractIter<T, Self>;
}
impl<I> Sealed2 for I where I: Iterator<Item = Row> {}
impl<I> IterExtractExt for I
where
I: Iterator<Item = Row>,
{
fn extract<T: ExtractOwned>(self) -> ExtractIter<T, Self> {
ExtractIter {
iter: self,
columns: None,
}
}
}
pub struct ExtractIterRef<'a, T, I>
where
T: Extract<'a>,
I: Iterator<Item = &'a Row>,
{
iter: I,
columns: Option<T::Columns>,
}
impl<'a, T, I> Iterator for ExtractIterRef<'a, T, I>
where
T: Extract<'a>,
I: Iterator<Item = &'a Row>,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
Some(T::extract(&mut self.columns, self.iter.next()?))
}
}
pub trait IterExtractRefExt<'a>: Iterator<Item = &'a Row> + Sized + Sealed1 {
fn extract_ref<T: Extract<'a>>(self) -> ExtractIterRef<'a, T, Self>;
}
impl<'a, I> Sealed1 for I where I: Iterator<Item = &'a Row> {}
impl<'a, I> IterExtractRefExt<'a> for I
where
I: Iterator<Item = &'a Row>,
{
fn extract_ref<T: Extract<'a>>(self) -> ExtractIterRef<'a, T, Self> {
ExtractIterRef {
iter: self,
columns: None,
}
}
}
mod sealed {
pub trait Sealed1 {}
pub trait Sealed2 {}
}