use serde::de::DeserializeOwned;
use std::collections::hash_map;
use std::slice;
use crate::serialization::Serializer;
pub struct PickleDbIterator<'a> {
pub(crate) map_iter: hash_map::Iter<'a, String, Vec<u8>>,
pub(crate) serializer: &'a Serializer,
}
impl<'a> Iterator for PickleDbIterator<'a> {
type Item = PickleDbIteratorItem<'a>;
fn next(&mut self) -> Option<Self::Item> {
match self.map_iter.next() {
Some((key, value)) => Some(PickleDbIteratorItem {
key,
value,
serializer: self.serializer,
}),
None => None,
}
}
}
pub struct PickleDbIteratorItem<'a> {
key: &'a str,
value: &'a Vec<u8>,
serializer: &'a Serializer,
}
impl<'a> PickleDbIteratorItem<'a> {
pub fn get_key(&self) -> &str {
self.key
}
pub fn get_value<V>(&self) -> Option<V>
where
V: DeserializeOwned,
{
self.serializer.deserialize_data::<V>(self.value)
}
}
pub struct PickleDbListIterator<'a> {
pub(crate) list_iter: slice::Iter<'a, Vec<u8>>,
pub(crate) serializer: &'a Serializer,
}
impl<'a> Iterator for PickleDbListIterator<'a> {
type Item = PickleDbListIteratorItem<'a>;
fn next(&mut self) -> Option<Self::Item> {
match self.list_iter.next() {
Some(value) => Some(PickleDbListIteratorItem {
value,
serializer: self.serializer,
}),
None => None,
}
}
}
pub struct PickleDbListIteratorItem<'a> {
value: &'a Vec<u8>,
serializer: &'a Serializer,
}
impl<'a> PickleDbListIteratorItem<'a> {
pub fn get_item<V>(&self) -> Option<V>
where
V: DeserializeOwned,
{
self.serializer.deserialize_data(self.value)
}
}