use std::{convert::AsRef, fmt::Debug, sync::Arc}; use conduwuit::{implement, Result}; use futures::{ future, stream::{Stream, StreamExt}, TryStreamExt, }; use serde::{Deserialize, Serialize}; use crate::keyval::{result_deserialize, serialize_key, KeyVal}; /// Iterate key-value entries in the map where the key matches a prefix. /// /// - Query is serialized /// - Result is deserialized #[implement(super::Map)] pub fn stream_prefix<'a, K, V, P>( self: &'a Arc, prefix: &P, ) -> impl Stream>> + Send where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, V: Deserialize<'a> + Send, { self.stream_prefix_raw(prefix) .map(result_deserialize::) } /// Iterate key-value entries in the map where the key matches a prefix. /// /// - Query is serialized /// - Result is raw #[implement(super::Map)] #[tracing::instrument(skip(self), level = "trace")] pub fn stream_prefix_raw

( self: &Arc, prefix: &P, ) -> impl Stream>> + Send where P: Serialize + ?Sized + Debug, { let key = serialize_key(prefix).expect("failed to serialize query key"); self.raw_stream_from(&key) .try_take_while(move |(k, _): &KeyVal<'_>| future::ok(k.starts_with(&key))) } /// Iterate key-value entries in the map where the key matches a prefix. /// /// - Query is raw /// - Result is deserialized #[implement(super::Map)] pub fn stream_raw_prefix<'a, K, V, P>( self: &'a Arc, prefix: &'a P, ) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, K: Deserialize<'a> + Send + 'a, V: Deserialize<'a> + Send + 'a, { self.raw_stream_prefix(prefix) .map(result_deserialize::) } /// Iterate key-value entries in the map where the key matches a prefix. /// /// - Query is raw /// - Result is raw #[implement(super::Map)] pub fn raw_stream_prefix<'a, P>( self: &'a Arc, prefix: &'a P, ) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, { self.raw_stream_from(prefix) .try_take_while(|(k, _): &KeyVal<'_>| future::ok(k.starts_with(prefix.as_ref()))) }