neo3/neo_contract/
iterator.rs

1use std::{fmt, sync::Arc};
2
3use crate::{
4	neo_clients::{APITrait, JsonRpcProvider, RpcClient},
5	neo_contract::ContractError,
6};
7use neo3::prelude::*;
8
9pub struct NeoIterator<'a, T, P: JsonRpcProvider> {
10	session_id: String,
11	iterator_id: String,
12	mapper: Arc<dyn Fn(StackItem) -> T + Send + Sync>,
13	provider: Option<&'a RpcClient<P>>,
14}
15
16impl<'a, T, P: JsonRpcProvider> fmt::Debug for NeoIterator<'a, T, P> {
17	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18		f.debug_struct("NeoIterator")
19			.field("session_id", &self.session_id)
20			.field("iterator_id", &self.iterator_id)
21			// For the mapper, you can decide what to print. Here, we just print a static string.
22			.field("mapper", &"<function>")
23			.finish()
24	}
25}
26
27impl<'a, T, P: JsonRpcProvider> NeoIterator<'a, T, P> {
28	pub fn new(
29		session_id: String,
30		iterator_id: String,
31		mapper: Arc<dyn Fn(StackItem) -> T + Send + Sync>,
32		provider: Option<&'a RpcClient<P>>,
33	) -> Self {
34		Self { session_id, iterator_id, mapper, provider }
35	}
36
37	pub async fn traverse(&self, count: i32) -> Result<Vec<T>, ContractError> {
38		let result = self
39			.provider
40			.unwrap()
41			.traverse_iterator(self.session_id.clone(), self.iterator_id.clone(), count as u32)
42			.await?;
43		let mapped = result.iter().map(|item| (self.mapper)(item.clone())).collect();
44		Ok(mapped)
45	}
46
47	pub async fn terminate_session(&self) -> Result<(), ContractError> {
48		self.provider
49			.unwrap()
50			.terminate_session(&self.session_id)
51			.await
52			.expect("Could not terminate session");
53		Ok(())
54	}
55}