use super::*;
pub struct Keys<'a, K> {
db_iter: rocksdb::DBRawIterator<'a>,
prefix: Vec<u8>,
_phantom: PhantomData<K>,
}
impl<'a, K: DeserializeOwned> Keys<'a, K> {
pub(crate) fn new(db_iter: rocksdb::DBRawIterator<'a>, prefix: Vec<u8>) -> Self {
Self {
db_iter,
prefix,
_phantom: PhantomData,
}
}
}
impl<'a, K: DeserializeOwned> Iterator for Keys<'a, K> {
type Item = K;
fn next(&mut self) -> Option<Self::Item> {
if self.db_iter.valid() {
let key = match self
.db_iter
.key()
.and_then(|k| if k.starts_with(&self.prefix) { Some(k) } else { None })
.map(|k| bincode::deserialize(&k[self.prefix.len()..]).ok())
{
Some(key) => key,
None => None,
};
self.db_iter.next();
key
} else {
None
}
}
}