#[cfg(any(feature = "turso", feature = "libsql"))]
use futures_lite::future::block_on;
#[cfg(feature = "turso")]
pub struct RowsIterator<T, F> {
rows: turso::Rows,
transform: F,
_marker: core::marker::PhantomData<T>,
}
#[cfg(feature = "turso")]
impl<T, F> RowsIterator<T, F>
where
T: Send + 'static,
F: FnMut(&turso::Row) -> Result<T, crate::core::errors::StorageError>,
{
#[must_use]
pub fn new(rows: turso::Rows, transform: F) -> Self {
Self {
rows,
transform,
_marker: core::marker::PhantomData,
}
}
}
#[cfg(feature = "turso")]
impl<T, F> Iterator for RowsIterator<T, F>
where
T: Send + 'static,
F: FnMut(&turso::Row) -> Result<T, crate::core::errors::StorageError>,
{
type Item = Result<T, crate::core::errors::StorageError>;
fn next(&mut self) -> Option<Self::Item> {
match block_on(self.rows.next()) {
Ok(Some(row)) => Some((self.transform)(&row)),
Ok(None) => None,
Err(e) => Some(Err(crate::core::errors::StorageError::Backend(e.to_string()))),
}
}
}
#[cfg(feature = "libsql")]
pub struct LibsqlRowsIterator<T, F> {
rows: libsql::Rows,
transform: F,
_marker: core::marker::PhantomData<T>,
}
#[cfg(feature = "libsql")]
impl<T, F> LibsqlRowsIterator<T, F>
where
T: Send + 'static,
F: FnMut(&libsql::Row) -> Result<T, crate::core::errors::StorageError>,
{
#[must_use]
pub fn new(rows: libsql::Rows, transform: F) -> Self {
Self {
rows,
transform,
_marker: core::marker::PhantomData,
}
}
}
#[cfg(feature = "libsql")]
impl<T, F> Iterator for LibsqlRowsIterator<T, F>
where
T: Send + 'static,
F: FnMut(&libsql::Row) -> Result<T, crate::core::errors::StorageError>,
{
type Item = Result<T, crate::core::errors::StorageError>;
fn next(&mut self) -> Option<Self::Item> {
match block_on(self.rows.next()) {
Ok(Some(row)) => Some((self.transform)(&row)),
Ok(None) => None,
Err(e) => Some(Err(crate::core::errors::StorageError::Backend(e.to_string()))),
}
}
}