tuwunel_database/map/
stream_from.rs1use std::{fmt::Debug, sync::Arc};
2
3use futures::{Stream, StreamExt};
4use rocksdb::Direction;
5use serde::{Deserialize, Serialize};
6use tuwunel_core::{Result, implement};
7
8use super::seek::seek_stream;
9use crate::{
10 keyval::{KeyVal, result_deserialize, serialize_key},
11 stream,
12};
13
14#[implement(super::Map)]
24pub fn stream_from<'a, K, V, P>(
25 self: &'a Arc<Self>,
26 from: &P,
27) -> impl Stream<Item = Result<KeyVal<'_, K, V>>> + Send + use<'a, K, V, P>
28where
29 P: Serialize + ?Sized + Debug,
30 K: Deserialize<'a> + Send,
31 V: Deserialize<'a> + Send,
32{
33 self.stream_from_raw(from)
34 .map(result_deserialize::<K, V>)
35}
36
37#[implement(super::Map)]
47#[tracing::instrument(skip(self), level = "trace")]
48pub fn stream_from_raw<P>(
49 self: &Arc<Self>,
50 from: &P,
51) -> impl Stream<Item = Result<KeyVal<'_>>> + Send + use<'_, P>
52where
53 P: Serialize + ?Sized + Debug,
54{
55 let key = serialize_key(from).expect("failed to serialize query key");
56 self.raw_stream_from(&key)
57}
58
59#[implement(super::Map)]
64pub fn stream_raw_from<'a, K, V, P>(
65 self: &'a Arc<Self>,
66 from: &P,
67) -> impl Stream<Item = Result<KeyVal<'_, K, V>>> + Send + use<'a, K, V, P>
68where
69 P: AsRef<[u8]> + ?Sized + Debug + Sync,
70 K: Deserialize<'a> + Send,
71 V: Deserialize<'a> + Send,
72{
73 self.raw_stream_from(from)
74 .map(result_deserialize::<K, V>)
75}
76
77#[implement(super::Map)]
82#[tracing::instrument(skip(self, from), fields(%self), level = "trace")]
83pub fn raw_stream_from<P>(
84 self: &Arc<Self>,
85 from: &P,
86) -> impl Stream<Item = Result<KeyVal<'_>>> + Send + use<'_, P>
87where
88 P: AsRef<[u8]> + ?Sized + Debug,
89{
90 seek_stream::<stream::Items<'_>, _>(self, Direction::Forward, Some(from.as_ref()))
91}