71 lines
1.7 KiB
Rust
71 lines
1.7 KiB
Rust
|
|
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<usize>,
|
||
|
|
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()
|
||
|
|
}
|
||
|
|
}
|