babelforce_manager_sdk/
http.rs1use crate::error::ManagerError;
4use crate::retry::{with_retry, RetryPolicy};
5
6#[derive(Debug, Clone)]
8pub struct Page<T> {
9 pub items: Vec<T>,
11 pub page: i32,
13 pub pages: i32,
15 pub total: Option<i32>,
17}
18
19pub(crate) async fn fetch_page<T, E, F, Fut, M>(
24 retry: &RetryPolicy,
25 map_err: M,
26 fetch: F,
27) -> Result<Page<T>, ManagerError>
28where
29 M: Fn(E) -> ManagerError,
30 F: Fn() -> Fut,
31 Fut: std::future::Future<Output = Result<(Vec<T>, i32, i32, Option<i32>), E>>,
32{
33 let (items, pages, current, total) = with_retry(retry, true, fetch).await.map_err(map_err)?;
34 Ok(Page {
35 items,
36 page: current,
37 pages,
38 total,
39 })
40}
41
42pub(crate) async fn collect_all<T, E, F, Fut, M>(
43 retry: &RetryPolicy,
44 map_err: M,
45 mut fetch: F,
46) -> Result<Vec<T>, ManagerError>
47where
48 M: Fn(E) -> ManagerError,
49 F: FnMut(i32) -> Fut,
50 Fut: std::future::Future<Output = Result<(Vec<T>, i32, i32), E>>,
51{
52 let mut out = Vec::new();
53 let mut page = 1;
54 loop {
55 let (items, pages, _current) = with_retry(retry, true, || fetch(page))
56 .await
57 .map_err(&map_err)?;
58 let empty = items.is_empty();
59 out.extend(items);
60 if empty || page >= pages {
64 return Ok(out);
65 }
66 page += 1;
67 }
68}