use alloc::sync::Arc;
use miden_protocol::account::AccountId;
use miden_protocol::block::BlockNumber;
use crate::ClientError;
use crate::store::{InputNoteRecord, NoteFilter, Store};
pub struct InputNoteReader {
store: Arc<dyn Store>,
consumer: AccountId,
block_range: Option<(BlockNumber, BlockNumber)>,
offset: u32,
}
impl InputNoteReader {
pub fn new(store: Arc<dyn Store>, consumer: AccountId) -> Self {
Self {
store,
consumer,
block_range: None,
offset: 0,
}
}
#[must_use]
pub fn in_block_range(mut self, from: BlockNumber, to: BlockNumber) -> Self {
self.block_range = Some((from, to));
self
}
pub fn reset(&mut self) {
self.offset = 0;
}
pub async fn next(&mut self) -> Result<Option<InputNoteRecord>, ClientError> {
let (block_start, block_end) = match self.block_range {
Some((from, to)) => (Some(from), Some(to)),
None => (None, None),
};
let note = self
.store
.get_input_note_by_offset(
NoteFilter::Consumed,
self.consumer,
block_start,
block_end,
self.offset,
)
.await
.map_err(ClientError::StoreError)?;
if note.is_some() {
self.offset += 1;
}
Ok(note)
}
}