neo3/neo_contract/
iterator.rs1use 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 .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}