start of the paged trait

This commit is contained in:
Jędrzej Stuczyński
2023-07-31 15:38:25 +01:00
parent e2bf9daf52
commit dd887bd89b
2 changed files with 18 additions and 46 deletions
@@ -1,7 +1,7 @@
// Copyright 2022-2023 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use crate::define_paged_response;
use crate::collect_paged;
use crate::nyxd::contract_traits::NymContractsProvider;
use crate::nyxd::error::NyxdError;
use crate::nyxd::CosmWasmClient;
@@ -454,33 +454,10 @@ pub trait MixnetQueryClient {
// extension trait to the query client to deal with the paged queries
// (it didn't feel appropriate to combine it with the existing trait
#[async_trait]
pub trait PagedMixnetClient: MixnetQueryClient + Send + Sync {
// async fn get_all_node_families(&self) -> Result<Vec<Family>, NyxdError> {
// let mut res = Vec::new();
// let mut start_after = None;
//
// loop {
// let paged_response = self
// .get_all_node_families_paged(start_after.take(), None)
// .await?;
// res.extend(paged_response.families);
//
// if let Some(start_next_after) = paged_response.start_next_after {
// start_after = Some(start_next_after)
// } else {
// break;
// }
// }
//
// Ok(res)
// }
// define_paged_response!(
// get_all_node_families,
// Family,
// get_all_node_families_paged,
// families
// );
pub trait PagedMixnetClient: MixnetQueryClient {
async fn get_all_node_families(&self) -> Result<Vec<Family>, NyxdError> {
collect_paged!(self, get_all_node_families_paged, families)
}
}
#[async_trait]
@@ -126,26 +126,21 @@ impl TryFrom<NymContracts> for TypedNymContracts {
}
}
// a simple helper macro to define a function to repeatedly call a paged query until a full response is constructed
// a simple helper macro to define to repeatedly call a paged query until a full response is constructed
#[macro_export]
macro_rules! define_paged_response {
( $f: ident, $r: ty, $fc: ident, $field: ident ) => {
async fn $f(&self) -> Result<Vec<$r>, NyxdError> {
let mut res = Vec::new();
let mut start_after = None;
macro_rules! collect_paged {
( $self:ident, $f: ident, $field: ident ) => {{
let mut res = Vec::new();
let mut start_after = None;
loop {
let paged_response = $self.$f(start_after.take(), None).await?;
res.extend(paged_response.$field);
loop {
let paged_response = self.$fc(start_after.take(), None).await?;
res.extend(paged_response.$field);
if let Some(start_next_after) = paged_response.start_next_after {
start_after = Some(start_next_after)
} else {
break;
}
if let Some(start_next_after) = paged_response.start_next_after {
start_after = Some(start_next_after)
} else {
break Ok(res);
}
Ok(res)
}
};
}};
}