sui_gql_client/queries/stream/
mod.rsuse std::future::Future;
use futures::Stream;
use super::fragments::PageInfoForward;
use super::Result;
use crate::GraphQlClient;
pub(super) fn forward<'a, 'b, Client, Vars, Req, Fut, Iter, T>(
client: &'a Client,
mut vars: Vars,
mut request: Req,
) -> impl Stream<Item = Result<T, Client>> + 'a
where
Client: GraphQlClient,
Vars: 'b + UpdatePageInfo + Clone,
Req: 'b + FnMut(&'a Client, Vars) -> Fut,
Fut: 'a + Future<Output = Result<(PageInfoForward, Iter), Client>>,
Iter: Iterator<Item = Result<T, Client>>,
T: 'static,
'b: 'a,
{
async_stream::try_stream! {
let mut has_next_page = true;
while has_next_page {
let (page_info, objects) = request(client, vars.clone()).await?;
vars.update_page_info(&page_info);
has_next_page = page_info.has_next_page;
for value in objects {
yield value?;
}
}
}
}
pub(super) trait UpdatePageInfo {
fn update_page_info(&mut self, info: &PageInfoForward);
}