use anyhow::{bail, Result}; use bytes::Bytes; use crate::iterators::StorageIterator; #[derive(Clone)] pub struct MockIterator { pub data: Vec<(Bytes, Bytes)>, pub error_when: Option, pub index: usize, } impl MockIterator { pub fn new(data: Vec<(Bytes, Bytes)>) -> Self { Self { data, index: 0, error_when: None, } } pub fn new_with_error(data: Vec<(Bytes, Bytes)>, error_when: usize) -> Self { Self { data, index: 0, error_when: Some(error_when), } } } impl StorageIterator for MockIterator { fn next(&mut self) -> Result<()> { if self.index < self.data.len() { self.index += 1; } if let Some(error_when) = self.error_when { if self.index == error_when { bail!("fake error!"); } } Ok(()) } fn key(&self) -> &[u8] { if let Some(error_when) = self.error_when { if self.index >= error_when { panic!("invalid access after next returns an error!"); } } self.data[self.index].0.as_ref() } fn value(&self) -> &[u8] { if let Some(error_when) = self.error_when { if self.index >= error_when { panic!("invalid access after next returns an error!"); } } self.data[self.index].1.as_ref() } fn is_valid(&self) -> bool { if let Some(error_when) = self.error_when { if self.index >= error_when { panic!("invalid access after next returns an error!"); } } self.index < self.data.len() } }