struct_db/iterator/
primary_iterator_start_with.rs

1use crate::common::unwrap_item;
2use crate::SDBItem;
3use std::marker::PhantomData;
4
5/// Same as [`PrimaryIterator`](crate::PrimaryIterator) but only returns values which primary key starts with the given prefix.
6pub struct PrimaryIteratorStartWith<'a, 'txn, 'db, T: SDBItem> {
7    pub(crate) range: redb::Range<'a, &'static [u8], &'static [u8]>,
8    pub(crate) start_with: &'a [u8],
9    pub(crate) _marker: PhantomData<(&'db (), &'txn (), T)>,
10}
11
12impl<'a, 'txn, 'db, T: SDBItem> Iterator for PrimaryIteratorStartWith<'a, 'txn, 'db, T> {
13    type Item = T;
14
15    fn next(&mut self) -> Option<Self::Item> {
16        match self.range.next() {
17            Some(Ok((k, v))) => {
18                let k = k.value();
19                if k.starts_with(self.start_with) {
20                    unwrap_item(Some(v))
21                } else {
22                    None
23                }
24            }
25            _ => None,
26        }
27    }
28}
29
30// TODO: Found a way to implement DoubleEndedIterator for StructDBIteratorStartWith