Skip to main content

thunkmetrc_wrapper/
utils.rs

1use 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}