sui_gql_client/queries/stream/
mod.rs1use std::future::Future;
5
6use futures::Stream;
7
8use super::fragments::PageInfo;
9use super::Result;
10use crate::GraphQlClient;
11
12pub(super) fn forward<'a, Client, Vars, Req, Fut, Iter, T>(
20 client: &'a Client,
21 mut vars: Vars,
22 mut request: Req,
23) -> impl Stream<Item = Result<T, Client>> + 'a
24where
25 Client: GraphQlClient,
26 Vars: 'a + UpdatePageInfo + Clone,
27 Req: 'a + FnMut(&'a Client, Vars) -> Fut,
28 Fut: Future<Output = Result<Page<Iter>, Client>>,
29 Iter: IntoIterator<Item = Result<T, Client>>,
30 T: 'static,
31{
32 async_stream::try_stream! {
33 let mut has_next_page = true;
34 while has_next_page {
35 let page = request(client, vars.clone()).await?;
36
37 vars.update_page_info(&page.info);
38 has_next_page = page.info.has_next_page;
39
40 for value in page.data {
41 yield value?;
42 }
43 }
44 }
45}
46
47pub(super) struct Page<T> {
48 pub(super) info: PageInfo,
49 pub(super) data: T,
50}
51
52impl<T> Page<T> {
53 pub(super) fn new(page_info: impl Into<PageInfo>, data: T) -> Self {
54 Self {
55 info: page_info.into(),
56 data,
57 }
58 }
59}
60
61pub(super) trait UpdatePageInfo {
62 fn update_page_info(&mut self, info: &PageInfo);
63}