diff --git a/core/src/raw/adapters/kv/api.rs b/core/src/raw/adapters/kv/api.rs index 3ee1b57639b..8f9b8e96583 100644 --- a/core/src/raw/adapters/kv/api.rs +++ b/core/src/raw/adapters/kv/api.rs @@ -26,30 +26,37 @@ use crate::Capability; use crate::Scheme; use crate::*; -/// ScanIter is the async iterator returned by `Adapter::scan`. +/// Scan is the async iterator returned by `Adapter::scan`. pub trait Scan: Send + Sync + Unpin { /// Fetch the next key in the current key prefix /// - /// `None` means no further key will be returned - fn next(&mut self) -> impl Future>> + MaybeSend; + /// `Ok(None)` means no further key will be returned + fn next(&mut self) -> impl Future>> + MaybeSend; } /// A noop implementation of Scan impl Scan for () { - async fn next(&mut self) -> Option> { - None + async fn next(&mut self) -> Result> { + Ok(None) } } -/// A ScanIterator implementation for all trivial non-async iterators +/// A Scan implementation for all trivial non-async iterators pub struct ScanStdIter(I); +#[cfg(any( + feature = "services-cloudflare-kv", + feature = "services-etcd", + feature = "services-nebula-graph", + feature = "services-rocksdb", + feature = "services-sled" +))] impl ScanStdIter where I: Iterator> + Unpin + Send + Sync, { /// Create a new ScanStdIter from an Iterator - pub fn new(inner: I) -> Self { + pub(crate) fn new(inner: I) -> Self { Self(inner) } } @@ -58,8 +65,8 @@ impl Scan for ScanStdIter where I: Iterator> + Unpin + Send + Sync, { - async fn next(&mut self) -> Option> { - self.0.next() + async fn next(&mut self) -> Result> { + self.0.next().transpose() } } @@ -67,17 +74,17 @@ where pub type Scanner = Box; pub trait ScanDyn: Unpin + Send + Sync { - fn next_dyn(&mut self) -> BoxedFuture>>; + fn next_dyn(&mut self) -> BoxedFuture>>; } impl ScanDyn for T { - fn next_dyn(&mut self) -> BoxedFuture>> { + fn next_dyn(&mut self) -> BoxedFuture>> { Box::pin(self.next()) } } impl Scan for Box { - async fn next(&mut self) -> Option> { + async fn next(&mut self) -> Result> { self.deref_mut().next_dyn().await } } diff --git a/core/src/raw/adapters/kv/backend.rs b/core/src/raw/adapters/kv/backend.rs index 520f14351ed..bdbe8202a7b 100644 --- a/core/src/raw/adapters/kv/backend.rs +++ b/core/src/raw/adapters/kv/backend.rs @@ -206,7 +206,7 @@ where } async fn inner_next(&mut self) -> Result> { - Ok(self.inner.next().await.transpose()?.map(|v| { + Ok(self.inner.next().await?.map(|v| { let mode = if v.ends_with('/') { EntryMode::DIR } else { diff --git a/core/src/raw/adapters/kv/mod.rs b/core/src/raw/adapters/kv/mod.rs index ef6d4793fee..c03c8d71b80 100644 --- a/core/src/raw/adapters/kv/mod.rs +++ b/core/src/raw/adapters/kv/mod.rs @@ -23,7 +23,14 @@ mod api; pub use api::Adapter; pub use api::Metadata; pub use api::Scan; -pub use api::ScanStdIter; +#[cfg(any( + feature = "services-cloudflare-kv", + feature = "services-etcd", + feature = "services-nebula-graph", + feature = "services-rocksdb", + feature = "services-sled" +))] +pub(crate) use api::ScanStdIter; pub use api::Scanner; mod backend; diff --git a/core/src/services/sqlite/backend.rs b/core/src/services/sqlite/backend.rs index f0f59da6301..06158048341 100644 --- a/core/src/services/sqlite/backend.rs +++ b/core/src/services/sqlite/backend.rs @@ -196,7 +196,7 @@ impl Adapter { } #[self_referencing] -pub struct SqlStream { +pub struct SqliteScanner { pool: SqlitePool, query: String, @@ -205,7 +205,7 @@ pub struct SqlStream { stream: BoxStream<'this, Result>, } -impl Stream for SqlStream { +impl Stream for SqliteScanner { type Item = Result; fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { @@ -213,16 +213,16 @@ impl Stream for SqlStream { } } -unsafe impl Sync for SqlStream {} +unsafe impl Sync for SqliteScanner {} -impl kv::Scan for SqlStream { - async fn next(&mut self) -> Option> { - ::next(self).await +impl kv::Scan for SqliteScanner { + async fn next(&mut self) -> Result> { + ::next(self).await.transpose() } } impl kv::Adapter for Adapter { - type Scanner = SqlStream; + type Scanner = SqliteScanner; fn metadata(&self) -> kv::Metadata { kv::Metadata::new( @@ -286,7 +286,7 @@ impl kv::Adapter for Adapter { async fn scan(&self, path: &str) -> Result { let pool = self.get_client().await?; - let stream = SqlStreamBuilder { + let stream = SqliteScannerBuilder { pool: pool.clone(), query: format!( "SELECT `{}` FROM `{}` WHERE `{}` LIKE $1",