thunkmetrc_wrapper/
utils.rs1use async_stream::stream;
2use futures_core::stream::Stream;
3use std::error::Error;
4use crate::models::PaginatedResponse;
5
6pub fn iterate_pages<T, F, Fut>(
7 fetcher: F,
8) -> impl Stream<Item = Result<T, Box<dyn Error + Send + Sync>>>
9where
10 T: Clone + Send + 'static,
11 F: Fn(i32) -> Fut + Send + Sync + 'static,
12 Fut: std::future::Future<Output = Result<PaginatedResponse<T>, Box<dyn Error + Send + Sync>>> + Send,
13{
14 stream! {
15 let mut page = 1;
16 loop {
17 let response = match fetcher(page).await {
18 Ok(res) => res,
19 Err(e) => {
20 yield Err(e);
21 return;
22 }
23 };
24
25 if let Some(data) = response.data {
26 if data.is_empty() {
27 break;
28 }
29 for item in data {
30 yield Ok(item);
31 }
32 } else {
33 break;
34 }
35
36 if let Some(total_pages) = response.total_pages {
37 if (page as i64) >= total_pages {
38 break;
39 }
40 }
41 page += 1;
42 }
43 }
44}